Bash腳本基礎
BASH = GNU Bourne-Again Shell,BASH 是 GNU 組織開發和推廣的一個項目。
Bash腳本類似批處理,簡單來講就是把許多的指令集合在一起,並提供循環、條件、判斷等重要功能,語法簡單實用,用以編寫程序,大大簡化管理員的操作,並可以完成圖形工具所無法實現的功能。
如何創建新shell腳本
- 創建包含bash命令的文本文件。文件的第一行應爲:
#!/bin/bash ##解釋器 - 使文件可執行(使用chmod +x scripts)
- 將文件放置在用戶的$PATH的目錄中
~/bin – 用於用戶的私有程序
/usr/local/bin – 本地開發、系統上的其他人使用的腳本
/usr/local/sbin - 本地開發、由root使用的腳本
直接運行腳本和使用source命令運行腳本是不同的!
引用和轉義
(1)弱引用—-” ”
將字符串放置在雙引號中,保留字符串中所有字符的文字值,$、`、\和!字符除外
[root@localhost mnt]# echo "date" ##顯示date字符
date
[root@localhost mnt]# TIME=`date` ##``即$(),表示優先執行的命令,這裏是給變量TIME定義
[root@localhost mnt]# echo "$TIME" ##顯示TIME變量
Tue Jun 20 08:35:07 EDT 2017
[root@localhost mnt]# echo "`date`" ##顯示當前時間
Tue Jun 20 08:35:29 EDT 2017
(2)強引用
將字符串放置在單引號中,保留字符串中所有字符的文字值,同時禁用所有擴展
[root@localhost mnt]# echo '`date`' ##顯示`date`字符,這裏``由於強引所以僅爲字符
`date`
(3)轉義
非引用的\是轉義字符。它保留了下一個字符的文字值。
[root@localhost ~]# echo `date` ##沒有轉義的
Tue Jun 20 08:44:47 EDT 2017
[root@localhost ~]# echo \`date\` ##轉義後的
`date`
Shell變量
shell變量用於爲稍後在腳本中使用的名稱指定值,並且僅限於shell命令行或從中聲明變量的腳本。
!!!定義的變量一般爲大寫字母。
若要定義或指定值:
FRUIT=apple
若要參考或使用變量:
$FRUIT
${FRUIT}
[root@localhost ~]# TIME=`date` ##定義變量
[root@localhost ~]# echo $TIME ##使用變量
Tue Jun 20 08:49:19 EDT 2017
[root@localhost ~]# echo "the time is ${TIME}" ##使用變量
the time is Tue Jun 20 08:49:19 EDT 2017
算術運算符
算術運算符指的是可以在程序中實現加、減、乘、除等數學運算的運算符。
++ 增量後
– 減量後
- 減法
+ 加法
** 冪運算
* 乘法
/ 除法
% 餘數
+= 加等
-= 減等
[root@localhost ~]# let A=1+2 ##加法
[root@localhost ~]# echo $A
3
[root@localhost ~]# let A=1-2 ##減法
[root@localhost ~]# echo $A
-1
[root@localhost ~]# let A=2*3 ##乘法
[root@localhost ~]# echo $A
6
[root@localhost ~]# let A=2**3 ##冪運算
[root@localhost ~]# echo $A
8
[root@localhost ~]# let A=10/5 ##除法
[root@localhost ~]# echo $A
2
[root@localhost ~]# let A=6%5 ##求餘數
[root@localhost ~]# echo $A
1
[root@localhost ~]# let A+=1 ##A+=1即A=A+1(由上一步運算已知A=1)
[root@localhost ~]# echo $A
2
[root@localhost ~]# let A-=4 ##A-=4即A=A-4(由上一步運算已知A=2)
[root@localhost ~]# echo $A
-2
Shell計算命令
用$[]表示數學運算
用expr表示數學運算
用let指示數學運算
用(())表示數學運算。bash內建功能,效率高
[root@localhost ~]# echo $[2+4]
6
[root@localhost ~]# echo `expr 2*4`
2*4
[root@localhost ~]# echo `expr 1+2`
1+2
[root@localhost ~]# let A=2+4
[root@localhost ~]# echo $A
6
循環
for循環用於值列表中的相同命令的重複。
(1)
for 變量名 in 列表值
do
操作
done ##表示結束
[root@localhost ~]# for NUM in 1 hello 2 westos 3 lee;do echo $NUM;sleep 1 ;done ##這裏sleep 1表示1秒執行一次
1
hello
2
westos
3
lee
(2)循環與計算的結合
for (())
do
done
這是一個類似C語言的for循環,它實現數值的讀取以及數值的運算((數值起始;數值終止;數值運算))
[root@localhost ~]# for ((i=1;i<10;i++));do echo $i;done
1
2
3
4
5
6
7
8
9
腳本示例
test.sh主機檢測
腳本test.sh實現檢測主機是否在運行,是則顯示up,否顯示down
ping -c1 -w1 , -c1 表示ping的次數爲1次,-w1表示結束次數
#!/bin/bash
for NUM in 172.25.254.{1..10};
do ping -c1 -w1 $NUM &>/dev/null && echo $NUM is up || echo $NUM is down
done
測試:
date.sh倒計時
date.sh
實現5秒的倒計時
#!/bin/bash
for ((i=5;i>0;i--))
do echo $i;
sleep 1;
done
測試:
time.sh倒計時
實現1分10秒的倒計時
1)分鐘不變,秒–
2)分=0,秒=0,結束倒計時
3)分!=0,秒=0,分–,秒変59,秒–
#!/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" ]
do
echo -n "after ${MIN}m${SEC}s is end"
sleep 1
echo -ne "\r \r"
((MIN--))
SEC=59
done
echo -n "after ${MIN}m${SEC}s is end "
echo -ne "\r \r"
sleep 1
done
測試:
conf.sh文件查找
查找/etc目錄下以.conf結尾的文件,並複製到/etcconfig-當前時間 目錄下
date +%F-%S ——%F表示full date; same as %Y-%m-%d,%S表示秒
#!/bin/bash
a=`date +%F-%S`
mkdir /etconfig-$a
cp /etc/*.conf /etconfig-$a
測試:
create_user.sh建立用戶
根據/mnt/userfile建立用戶
若用戶存在則顯示the user is existed
#!/bin/bash
for USER in `cat /mnt/username`
do
useradd $USER &>/dev/null && echo "successful" || echo "$USER is existed";
done
測試:
check_file文件存在確認
檢測文件或目錄的存在
#!/bin/bash
ls $1 &> /dev/null && echo "the $1 is existed" || echo "the file is not existed"
測試:
數據庫備份
備份數據庫並保存到相應目錄,備份的文件要有時間戳,且顯示文件的大小
#!/bin/bash
mkdir /mnt/dbdir &> /dev/null
for DB in `mysql -uroot -pwestos -e "show databases;" -N -E | grep -E '\*|schema$' -v`
do
echo "Backing up $DB"
mysqldump -u root -pwestos $DB > /mnt/dbdir/$DB-`date +%F`.sql
done
for DBDUMB in /mnt/dbdir/*
do
SIZE=`stat --print "%s\n" $DBDUMB`
echo ""
echo "$DBDUMB's size is $SIZE"
done
測試: