腳本 1

####腳本####

Bash腳本基礎

   BASH = GNU Bourne-Again Shell,BASH 是 GNU 組織開發和推廣的一個項目。Bash腳本類似批處理,簡單來講就是把許多的指令集合在一起,並提供循環、條件、判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操作,並可以完成圖形工具所無法實現的功能。

 

1.腳本通常以.sh結尾

2.編寫腳本是通常寫到

#!/bin/bash    ##/bin/bash爲解釋器,解釋原文件名中的內容

#!/bin/sh    ##/bin/sh也爲解釋器

[root@desktop13 mnt]# chmod +x /mnt/haha.sh

[root@desktop13 mnt]# /mnt/haha.sh    ##直接執行腳本內容(使用腳本內部中寫的解釋器)

hello

 

[root@desktop13 mnt]# ps f    ##查看從屬關係

  PID TTY      STAT   TIME COMMAND

 4114 pts/1    Ss     0:00 -bash

 4417 pts/1    T      0:00  \_ /bin/bash /mnt/ha.sh    ##使用bash解釋器執行此腳本

 4418 pts/1    T      0:00  |   \_ cat

 4427 pts/1    R+     0:00  \_ ps f

 4060 tty6     Ss+    0:00 -bash

 1867 pts/0    Ss+    0:00 -bash

 1678 tty1     Ss+    0:05 /usr/bin/Xorg :0 -background none -ve

 1993 ttyS0    Ss+    0:00 /sbin/agetty --keep-baud ttyS0 115200

 

 

3.腳本調試模式:

[root@desktop13 mnt]# cat /mnt/ha.sh

#!/bin/bash -x    ##添加-x是爲了腳本調試,會同時輸出本來需要輸入的內容

 echo hello

[root@desktop13 mnt]# /mnt/ha.sh

+ echo hello

hello

 

如果腳本中不添加-x時

sh -x /mnt/ha.sh    ##-x會輸出文件本來的輸入內容

 

 

 

4.引用和轉義

   引用和轉義在shell解析字符串時用於去除字符串中特殊字符或保留詞語的特殊含義。這會導致按字面處理字符串,而不是展開變量或將其部分內容視作具有特殊含義。

引用有三種類型:

1)

弱引用

   將字符串放置在雙引號中,保留字符串中所有字符的文字值,$、`、\和!字符除外。換言之,變量擴展和命令擴展在雙引號內仍起作用。

echo “can I have a $FRUIT”

echo “The current time is $(date +%r).”

$i    ##指變量值

i    ##指變量

$    ##變量取值

`    ##讓指令先執行

\    ##引用單個字符

""    ##引用部分字符('' $  ! 這三個均不引用)————這個爲弱引用

2)

強引用

將字符串放置在單引號中,保留字符串中所有字符的文字值,同時禁用所有擴展:

'    ##轉譯所有的字符

3)

轉義

非引用的\是轉義字符。它保留了下一個字符的文字值。(例如,\$PATH是確切的字符串$PATH,而

不是PATH變量的內容。)

\    ##轉譯單個字符

 

測試:

 

[root@server0 ~]# echo # not a comment #

[root@server0 ~]# echo \# not a comment #

# not a comment

[root@server0 ~]# echo \# not a comment \#

# not a comment #

[root@server0 ~]# echo '# not a comment #'

# not a comment #

[root@server0 ~]# echo '$HOME'

$HOME

[root@server0 ~]# echo '`pwd`'

`pwd`

[root@server0 ~]# echo '"Hello,world"'

"Hello,world"

[root@server0 ~]# echo "$HOME"

/root

[root@server0 ~]# echo "`pwd`"

/root

[root@server0 ~]# echo ""Hello, world""

Hello, world

[root@server0 ~]# echo "\$HOME"

$HOME

[root@server0 ~]# echo "\`pwd\`"

`pwd`

[root@server0 ~]# echo "\"Hello, world\""

"Hello, world"

 

 

5.Shell變量

shell變量用於爲稍後在腳本中使用的名稱指定值,並且僅限於shell命令行或從中聲明變量的腳本。

若要定義或指定值:

FRUIT=apple

若要參考或使用變量:

$FRUIT

${FRUIT}

[root@server0 ~]# FIRST=John

[root@server0 ~]# LAST=Doe

[root@server0 ~]# echo $FIRST $LAST

John Doe

[root@server0 ~]# echo $FIRST_$LAST

Doe

[root@server0 ~]# echo ${FIRST}_$LAST

John_Doe

 

 

6.循環

for NUM in 1 hello 2 westos 3 lee;do echo$NUM ; done     ##NUM後面是6個數

for NUM in 1 hello 2 westos 3 lee;do echo$NUM ;sleep 1; done    ##執行完上一個的時候停一秒執行下一個

[root@server0 ~]# for HOST in host{1..3};do echo $HOST;done

host1

host2

host3

 

7.條件語句

a=1

while [ "$a" -ge "1" -a "$a" -lt "10" ]; do echo yes; break;done    ##當a大於等於1,小於10的時候輸出yes

yes

 

-ge     大於等於

-gt    大於

-lt    小於

 

 

實驗:

1)要求:測試1~10主機是否能ping

[root@desktop13 mnt]# vim haha.sh

[root@desktop13 mnt]# cat haha.sh

#!/bin/bash

for i in {1..10}

do ping -c1 -w1 172.25.254.$i &> /dev/null && echo 172.25.254.$i is up || echo 172.25.254.$i is down    ##-c1執行次數,-w1等待時間

done  

[root@desktop13 mnt]# /mnt/haha.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@desktop13 mnt]# sh -x /mnt/haha.sh

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

+ ping -c1 -w1 172.25.254.1

+ echo 172.25.254.1 is up

172.25.254.1 is up

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

+ ping -c1 -w1 172.25.254.2

+ echo 172.25.254.2 is up

172.25.254.2 is up

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

+ ping -c1 -w1 172.25.254.3

+ echo 172.25.254.3 is up

172.25.254.3 is up

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

+ ping -c1 -w1 172.25.254.4

+ echo 172.25.254.4 is up

172.25.254.4 is up

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

+ ping -c1 -w1 172.25.254.5

+ echo 172.25.254.5 is up

172.25.254.5 is up

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

+ ping -c1 -w1 172.25.254.6

+ echo 172.25.254.6 is up

172.25.254.6 is up

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

+ ping -c1 -w1 172.25.254.7

+ echo 172.25.254.7 is up

172.25.254.7 is up

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

+ ping -c1 -w1 172.25.254.8

+ echo 172.25.254.8 is down

172.25.254.8 is down

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

+ ping -c1 -w1 172.25.254.9

+ echo 172.25.254.9 is up

172.25.254.9 is up

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

+ ping -c1 -w1 172.25.254.10

+ echo 172.25.254.10 is up

172.25.254.10 is up

[root@desktop13 mnt]#

 

 

2)要求:自動建立用戶

[root@desktop13 mnt]# cat /mnt/username

xiao

ha

xi

[root@desktop13 mnt]# cat create_user.sh

#!/bin/bash

for name in `cat /mnt/username` 或者 for name in `cat $1`

do useradd $name

done

[root@desktop13 mnt]# sh create_user.sh username

[root@desktop13 mnt]# id xiao

uid=1001(xiao) gid=1001(xiao) groups=1001(xiao)

[root@desktop13 mnt]# id xi

uid=1003(xi) gid=1003(xi) groups=1003(xi)

[root@desktop13 mnt]# id ha

uid=1002(ha) gid=1002(ha) groups=1002(ha)

 

3)要求:將/etc/*.conf 文件複製到/mnt/$BACKDIR下

vim /mnt/backup.sh

#!/bin/bash

BACKDIR=etcconfig-`date +%Y-%m-%d-%S`##年月日秒

mkdir -p /mnt/$BACKDIR

cp /etc/*.conf /mnt/$BACKDIR

 

chmod +x backup.sh

 

/mnt/backup.sh

cd /mnt

ls

 

4)要求:倒計時5秒

[root@desktop13 mnt]# cat text3.sh

#!/bin/bash

for ((i=5;i>0;i--))

do

echo -n After ${i}s is end

echo -ne "\r\r"

sleep 1

done

[root@desktop13 mnt]# chmod +x /mnt/text3.sh

[root@desktop13 mnt]# /mnt/text3.sh

After 4s is end

 

5)要求:70s倒計時

[root@desktop13 mnt]# cat text4.sh

#!/bin/bash

MIN=1

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

do

while [ "$SEC" -eq "0" -a "$MIN" -eq "0" ]

do

echo "TIME is END"

exit 0

done

 

while [ "$SEC" -eq "0" -a "$MIN" -ge "0" ]

do

(( MIN-- ))

SEC=59

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

sleep 1

echo -ne "\r\r"

done

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

echo -ne "\r\r"

sleep 1

done

 

[root@desktop13 mnt]# /mnt/text4.sh

TIME is END

 

 

 

6)要求:腳本mysql的備份

#!/bin/bash

for DB in $(mysql -uroot -e "show databases" -E -N | grep -v '^*' | grep -v 'schema$')

        do

        echo "Backing up $DB"

        mysqldump -uroot $DB > /dbbackup/$DB-`date +%Y-%m-%d`.dump##備份到這塊(重定向)

        done

echo ""

for DBDUMP in /dbbackup/*

        do

        SIZE=$(stat --printf "%s\n" $DBDUMP)

        echo "$DBDUMP $SIZE"

        done

 

[root@desktop13 mnt]# /mnt/text5.sh

Backing up mysql

Backing up test

Backing up westos

 

/dbbackup/mysql-2017-06-11.dump 514670

/dbbackup/test-2017-06-11.dump 1261

/dbbackup/westos-2017-06-11.dump 1835

 

 

7)要求:查找設備ip

[root@desktop13 mnt]# vim change_show.sh

#!/bin/bash

read -p "please give me a interface:"

ifconfig eth0 | grep netmask | awk -F " " '{print $2}'

 

[root@desktop13 mnt]# /mnt/change_show.sh

please give me a interface:eth0

172.25.254.113

 

帶提示的查找:

[root@desktop13 mnt]# vim text6.sh

#!/bin/bash

echo `ifconfig | grep flags | cut -d : -f 1`

read -p "please give me a interface:"

ifconfig $1 | grep netmask | awk -F " " '{print $2}'

[root@desktop13 mnt]# /mnt/text6.sh eth0

eth0 eth1 eth2 lo team0

please give me a interface:eth0

172.25.254.113

 

 

8)要求:輸入ip判斷網是否通暢

[root@desktop13 mnt]# vim text7.sh

#!/bin/bash

while [ "$#" -eq "0" ]

do

echo "please give me a ip address!"

exit 1

done

ping -c 1 -w 1 $1 > /devnull && echo "$1 is up" || echo "$1 is down"

 

[root@desktop13 mnt]# chmod +x text7.sh

[root@desktop13 mnt]# /mnt/text7.sh

please give me a ip address!

[root@desktop13 mnt]# /mnt/text7.sh  172.25.254.13

172.25.254.13 is up

[root@desktop13 mnt]# /mnt/text7.sh  172.25.254.77

172.25.254.77 is down

 

 

 

退出狀態

Linux命令完成時,將返回退出狀態。成功完成程序時,將返回0的推出狀態。這被bash當作邏輯True值。非零退出狀態通常表示發生了錯誤,並且被bash當作邏輯False值。

例如:grep的退出狀態的含義:

0 – 在指定的文件中找到了模式

1 – 在指定的文件中未找到模式

>1 – 一些其他錯誤(無法打開文件、錯誤的搜索表達式等)

推出狀態的值被存儲在"?"中,可以使用以下命令查看:

# echo $?

 

 

 


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