Bash腳本

{**Bash腳本基礎**}

BASH=GNU Bourne-Again Shell,BASH是GNU組織開發和推廣的一個項目。

Bash腳本類似批處理,簡單來講就是把許多的指令集合在一起,並提供循環、條件、判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操作,並可以完成圖形工具無法實現的功能。

[1.如何創建新shell腳本]

1.創建包含bash命令的文本文件(一般文件名後加.sh),文件第一行:

 #!/bin/bash

2.使文件可執行(chmod +x scripts)

3.將文件放置在用戶的$PATH的目錄中

   /bin    用於用戶的私有程序

   /usr/local/bin   本地開發、系統上的其他人使用的腳本

   /usr/local/sbin  本地開發、由root使用的腳本

運行腳本:sh+文件名或者直接編寫文件所在絕對路徑

例如:

[root@web1 mnt]# vim 1.sh      編寫腳本(以下爲內容)

#!/bin/bash

echo hello world

[root@web1 mnt]# chmod +x 1.sh   給可執行權限

[root@web1 mnt]# /mnt/1.sh       運行腳本

hello world

[root@web1 mnt]# sh 1.sh         運行腳本

hello world

 

[root@web1 mnt]# vim 1.sh

#!/usr/bin/env/tcsh -x

cat /mnt/1.sh

[root@web1 mnt]# sh -x 1.sh   (對於/usr/bin/env這種腳本,執行時用sh)

+ cat /mnt/1.sh

#!/usr/bin/env tcsh -x

cat /mnt/1.sh

 

[root@web1 mnt]# echo $2   (特殊字符如$ ! `` # *等需要在前加轉義字符\才能顯示)

 

[root@web1 mnt]# echo \$2

$2

[root@web1 mnt]# echo '\$2'   (''強化顯示)

\$2

[root@web1 mnt]# echo "\$2"   (""弱化顯示)

$2

[root@web1 mnt]# echo "''"

''

[root@web1 mnt]# echo '""'

""

[root@web1 mnt]# echo \'\'

''

[root@web1 mnt]# echo ****** ******      (顯示當前目錄的所有內容)

1.sh Kwestos.+157+49996.key Kwestos.+157+49996.private 1.sh Kwestos.+157+49996.key Kwestos.+157+49996.private

[root@web1 mnt]# echo "****** ******"    (要想顯示**需要加"")

****** ******

[root@web1 mnt]# echo "****** `date` ******"

****** Tue Dec 13 08:39:41 EST 2016 ******

[root@web1 mnt]# echo '****** `date` ******'

****** `date` ******

 

[root@web1 mnt]# a=1        給a一個值

[root@web1 mnt]# echo $a    輸出a的值

1

[root@web1 mnt]# echo $ab

 

[root@web1 mnt]# echo ${a}b  

1b

[root@web1 mnt]# a=`date`

[root@web1 mnt]# echo $a

Tue Dec 13 08:47:17 EST 2016

 

[命令替換]

 

[root@web1 mnt]# s=`date`

[root@web1 mnt]# echo $s

Wed Dec 14 08:18:20 EST 2016

[root@web1 mnt]# vim 4.sh

[root@web1 mnt]# echo $s

Wed Dec 14 08:18:20 EST 2016

[root@web1 mnt]# sh 4.sh

 

[root@web1 mnt]# s=1

[root@web1 mnt]# sh 4.sh

 

[root@web1 mnt]# export s=1

[root@web1 mnt]# sh 4.sh

1

[root@web1 mnt]# cd

[root@web1 ~]# chmod +x /mnt/4.sh   加執行權限

[root@web1 ~]# /mnt/4.sh

 

[root@web1 ~]# vim .bash_profile

PATH=$PATH:$HOME/bin

 

export PATH

s=1           添加設置s的值爲1

[root@web1 ~]# source .bash_profile   要執行腳本須執行此命令

[root@web1 ~]# /mnt/4.sh

1

[root@web1 ~]# su - student

Last login: Wed Dec 14 07:57:25 EST 2016 on pts/0

[student@web1 ~]$ /mnt/4.sh

 

[student@web1 ~]$ logout

[root@web1 ~]# vim /etc/profile     配置文件

[root@web1 ~]# /mnt/4.sh

1

[root@web1 ~]# source /etc/profile   刷新

[root@web1 ~]# /mnt/4.sh

10

[root@web1 ~]# logout

Connection to 172.25.254.149 closed.

[kiosk@foundation49 Desktop]$ ssh [email protected]

[email protected]'s password:

Last login: Wed Dec 14 08:05:53 2016 from 172.25.254.49

[root@web1 ~]# /mnt/4.sh     重新登陸時腳本將變爲初次設置的值(vim .bash_profile中設置的值)

1

[root@web1 ~]# su - student

Last login: Wed Dec 14 08:22:10 EST 2016 on pts/0

[student@web1 ~]$ /mnt/4.sh   其他用戶

10

[student@web1 ~]$

[root@web1 ~]# vim .bash_profile

export PATH

export s=1

export PATH=$PATH:/mnt

[root@web1 ~]# source .bash_profile

[root@web1 ~]# 4.sh

1

[root@web1 ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/mnt

 

[shell計算命令]

++  自增

--  自減

-   減法     +  加法

**  冪運算   *  乘法

/   除法     %  餘數

+=  加等     -= 減等

[root@web1 ~]# echo $[1+2]

3

[root@web1 ~]# echo $[2*2]

4

[root@web1 ~]# echo $[2**3]

8

[root@web1 ~]# echo $[2/3]

0

[root@web1 ~]# echo $[2%3]

2

[root@web1 ~]# echo `expr 1 + 2 `   用expr表示數學運算  

3

[root@web1 ~]# let a=1+2      用let指示數學運算

[root@web1 ~]# echo $a

3

[root@web1 ~]# ((a=3+4))    用(())表示數學運算。bash內建功能,效率高

[root@web1 ~]# echo $a

7

[root@web1 ~]# a=2+3        此種寫法不是運算會按照字符輸出

[root@web1 ~]# echo $a

2+3           

查看文件屬性:

test -{b|c|e|f|d|r|w|x|s|L} file/directory

 

[ -b /dev/sda ];echo $?         判斷文件是否爲一個block device

1               

[ -c /dev/sda ];echo $?         判斷文件是否存在且是一個character device

0

[ -e /dev/sda ];echo $?         判斷文件是否存在,常用

0

[ -f /dev/sda ];echo $?         判斷文件是否存在且爲文件(file),常用

0   

[ -d /dev/sda ];echo $?         判斷文件是否存在且爲目錄(directory),常用

1

[ -L /dev/sda ];echo $?         判斷文件是否存在且爲一個鏈接文件

1

test -{zn} string

 

test -z string            判斷字符串是否爲0?若string爲空字符串,則爲true

test -n string             判斷判斷字符串是否非爲0?若string爲空字符串,則爲false

            

[root@web1 ~]# for (( i=1;i<=10;i++ )) ; do echo $i; done

[root@web1 ~]# for (( i=1;i<10;i++ )) ; do ((j+=i)); echo $j; done

1

3

6

10

15

21

28

36

45

腳本常用語句(for;do;done語句,while;do;done語句等)

 

腳本---> 10秒倒計時腳本:

[root@web1 mnt]# vim time.sh      

[root@web1 mnt]# sh time.sh       執行腳本

[root@web1 mnt]# cat time.sh

#!/bin/bash

for ((SEC=10;SEC>0;SEC--))

do

echo -ne "After ${SEC}s is end"

echo -ne "\r  \r"                  換行

sleep 1                            停頓1秒

Done

 

腳本---> 一分十秒倒計時腳本;

[root@web1 mnt]# vim time.sh     

[root@web1 mnt]# sh time.sh

After 0:56s is end^C

[root@web1 mnt]# cat time.sh

#!/bin/bash

MIN=1

for ((SEC=10;SEC>=0;SEC--))

do

echo -ne "After ${MIN}:${SEC}s is end"

sleep 1

echo -ne "\r  \r"      

                 while [ "$SEC" -le "0" -a "$MIN" -gt "0" ]

                 do

                 echo -ne "After ${MIN}:${SEC}s is end"

                 echo -ne "\r  \r"

                 ((MIN--))

                 SEC=60

                 done

Done

 

腳本---> 連接172.25.254.x 能ping通顯示is up,不能ping通顯示:

[root@web1 mnt]# vim ping.sh   is down的腳本

[root@web1 mnt]# sh ping.sh

172.25.254.1 is up

172.25.254.2 is up

172.25.254.3 is up

172.25.254.4 is up

172.25.254.5 is up

172.25.254.6 is up

172.25.254.7 is up

172.25.254.8 is down

172.25.254.9 is up

172.25.254.10 is up

[root@web1 mnt]# cat ping.sh

#!/biin/bash

for NUM in {1..10}

do

ping -c1 -w1 172.25.254.$NUM &> /dev/null

    while

    [ "$?" -eq "0" ]

    do

    echo 172.25.254.$NUM is up

    break

    done

    while

    [ "$?" -ne "0" ]

    do

    echo 172.25.254.$NUM is down

    done

done

也可以是第二種:

[root@web1 mnt]# vim ping.sh

[root@web1 mnt]# cat ping.sh

#!/biin/bash

for NUM in {1..10}

do

ping -c1 -w1 172.25.254.$NUM &> /dev/null && echo 172.25.254.$NUM is up || echo 172.25.254.$NUM is down

done

[root@web1 mnt]# bash -x ping.sh   查看腳本信息

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.1

+ echo 172.25.254.1 is up

172.25.254.1 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.2

+ echo 172.25.254.2 is up

172.25.254.2 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.3

+ echo 172.25.254.3 is up

172.25.254.3 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.4

+ echo 172.25.254.4 is up

172.25.254.4 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.5

+ echo 172.25.254.5 is up

172.25.254.5 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.6

+ echo 172.25.254.6 is up

172.25.254.6 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.7

+ echo 172.25.254.7 is up

172.25.254.7 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.8

+ echo 172.25.254.8 is down

172.25.254.8 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.9

+ echo 172.25.254.9 is up

172.25.254.9 is down

+ for NUM in '{1..10}'

+ ping -c1 -w1 172.25.254.10

+ echo 172.25.254.10 is up

172.25.254.10 is down

腳本---> 數據庫備份:

vim MsqDump.sh

 

#!/bin/bash

 

for x in $(mysql -uroot -predhat -e "show databases;"   -NE | grep -E "^\*|schema$"-v)

do

        mysqldump -uroot -predhat $x >/mnt/$x.dump

done

[]數字運算比較符 -z 爲空 -n 不爲空

 -eq 等於 -lt小於  -le小於等於  -gt 大於  -ge大於等於

文件狀態運算符:

-d 設備 -c字符 -e是否可執行 -L軟鏈接 -d目錄 -f普通文件




1.Vim time.sh

#!/bin/bash

HOUR=1

MIN=1

for ((SEC=10;SEC>=0;SEC--))

do

echo -ne "After ${MIN}:${SEC}s is end"

sleep 1

echo -ne "\r  \r"  

        while [ "$SEC" -le "0" -a "$MIN" -gt "0" -a "$HOUR"  -ge "0"  ]    

                 while [ "$SEC" -le "0" -a "$MIN" -gt "0" -a "$HOUR"  -ge "0"  ]

                 do

                 echo -ne "After ${MIN}:${SEC}s is end"

                 echo -ne "\r  \r"

                 (($HOUR--))

                 MIN=60

                 done

         ((MIN--))

         SEC=60

         done

Done

 

2.vim connection.sh

  #!/bin/bash
  for NUM  in {1..30}
  do
  ping -c1 -w1 172.25.254.$NUM &> /dev/null && (
         /mnt/ping.exp 172.25.254.$NUM redhat echo '#!/bin/bash' > userfile ec    ho CKUSER='gentent passwd westos$NUM' >>userfile echo '[ -z "$CKUSER"]&&(user    add westos$NUM ' >> userfile echo 'echo 172.25.254.$NUM | passwd --stdin weto    s$NUM) || echo "westos$NUM exist!"'
  ) || echo 172.25.254.$NUM is connected faild
 done

3.vim check.exp

#!/usr/bin/expect
set timeout 3
set Ip      [lindex $argv 0]
set Pass      [lindex $argv 1]
set comn      [lindex $argv 2]
spawn  ssh root@$ip $comn
expect {
        "yes/no"
        {send"yes/r";exp_continue}
        "password:"
        {send "$Pass\r"}
        }

expect eof



 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章