一:bash指令有執行狀态傳回值;
echo $? 可以檢視指令的狀态傳回值,判斷是否成功執行
bash的變量類型:
本地變量
局部變量
環境變量
位置變量
特殊變量:
$?: 用于儲存剛剛執行的指令的狀态傳回值;
0:成功執行;
1-255:失敗
可以使用exit指令在腳本中自定義腳本執行狀态傳回值;如果不定義,腳本執行狀态傳回值取決于腳本執行結束前最後執行的那個語句的狀态
$@, $*: 所有位置參數;
$#: 位置參數的個數;
二:單分支if語句:
if 條件; then
語句1
語句2
...
fi
1:寫一個腳本,實作如下功能:
如果/etc/rc.d/rc.sysinit中有空白行,就顯示其空白行數;
#!/bin/bash
#
File='/etc/rc.d/rc.sysinit'
if grep "^$" $File &> /dev/null; then
grep "^$" $File | wc -l
三:雙分支if語句:
語句1
語句2
...
else
四:bash條件測試:
整數測試:expression: 數值1 比較符号 數值2
$A 比較符号 $B
大于:-gt, 例如 $A -gt $B
大于或等于:-ge
等于:-eq
小于:-lt
小于或等于:-le
不等于:-ne
bash有個内置變量:$RANDOM可以随機生成不同的數
1:寫一腳本,随機生成一個整數,判定,顯示其奇偶性;
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
echo "$A: Even"
echo "$A: Odd"
bash程式設計: 位置變量$1, $2, $3, $4, ...
2:計算N以内所有奇數的和以及所有偶數的和;分别顯示之;N是通過參數傳遞過來的正整數;
EvenSum=0
OddSum=0
for I in `seq 1 $1`;do
if [ $[$I%2] -eq 1 ]; then
OddSum=$[$OddSum+$I]
else
EvenSum=$[$EvenSum+$I]
fi
done
echo "EvenSum: $EvenSum."
echo "OddSUm: $OddSum."
echo "Sum: $[$EvenSum+$OddSum]"
shift [n]:實作位置參數輪替;
3:通過參數傳遞n個正整數給腳本,求其和;
Sum=0
for I in `seq 1 $#`; do
Sum=$[$Sum+$1]
shift
echo $Sum
五:bash字元測試:
>: 大于
<: 小于
==: 等于
=~: 判斷左邊的字元串是否能夠被右邊的模式所比對;通常用于[[]];
[[ $opt1 =~ $opt2 ]]一般做行首、行尾錨定;不要加引号;
單目:
-z $STRING: 為空則為真,不空則為假;
-n $STRING: 為空則為假,不空則真;
1:寫一個腳本,判定使用者的shell是否為bash;[ "$Shell" == "/bin/bash" ]
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then
echo "No such user or User's shell is null."
exit 10
if [ "$Shell" == "/bin/bash" ]; then
echo "Bash User."
Ret=0
echo "Not Bash User."
Ret=9
exit $Ret
bash知識點:組合條件測試
-a: 與
-o: 或
!: 非,單目操作符
bash指令組合測試:
&&: 與
||: 或
!: 非
六:bash條件判斷之多分支if語句:
文法格式:
if 條件1; then
elif 條件2; then
elif 條件3; then
1:寫一個腳本,其可以接受三個參數,最後一個參數為檔案名,但參數可變化,形如:
script.sh -a MageEdu /magedu.com/scripts/test1.sh
script.sh -d 2013-07-19 /magedu.com/scripts/test1.sh
script.sh -D 'some infomation' /magedu.com/scripts/test1.sh
此腳本能夠建立/magedu.com/scripts/test1.sh檔案,并且,如果給出了-a MageEdu,則檔案前兩行為:
# Author: MageEdu
如果給出了-d 2013-07-19,則檔案前兩行為:
# Date: 2013-07-19
如果給出了-D "some infomation",則檔案前兩行為:
# Description: some infomation
其它任何參數,均提示錯誤并退出;
進一步:如果沒有退出,則使用vim打開此檔案,并使用光标預設處于最後一行;
再進一步:儲存退出後,如果檔案有文法錯誤提示使用者有錯誤;
更進一步:如果沒有文法錯誤,則給些檔案賦予執行權限;
a.sh -a mageedu /tmp/test.sh
# Author: mageedu
a.sh -d 2013-07-19 /tmp/test.sh
a.sh -D "test script" /tmp/test.sh
# Description: test script
mkscript
#!/bin/bash
if [ $# -ne 3 ]; then
echo "the number of arguements is wrong."
exit 4
echo '#!/bin/bash' >> $3
if [ $1 == '-a' ]; then
echo "# Author: $2" >> $3
elif [ $1 == '-d' ]; then
echo "# Date: $2" >> $3
elif [ $1 == '-D' ]; then
echo "# Description: $2" >> $3
echo "Unknown option, ignore it."
rm -f $3
exit 5
vim + $3
if bash -n $3 &> /dev/null; then
chmod +x $3
echo "Syntax wrong in $3."
七:bash測試之檔案測試:
操作符 檔案路徑
-f: 測試其是否為普通檔案,即ls -l時檔案類型為-的檔案;
-d: 測試其是否為目錄檔案,即ls -l時檔案類型為d的檔案;
-e: 測試檔案是否存在;存在為真,否則為假;
-r: 測試檔案對目前使用者來說是否可讀;
-w: 測試檔案對目前使用者來說是否可寫;
-x: 測試檔案對目前使用者來說是否可執行;
-s: 測試檔案大小是否不空,不空則真,空則假;
短路操作:隻要前半段已經可以決定最終結果,後半段就不再運算;
與運算:
真 && 真 = 真
真 && 假 = 假
假 && {真|假} = 假
或運算:
假 || 假= 假
假 || 真= 真
真 || 真=真
! id $UserName &> /dev/null && useradd $UserName || echo "$UserName exists."
1假設使用者存在,對其取反! id $UserName為假,根據與運算的特點可以得! id$UserName &> /dev/null && useradd $UserName 為假,根據或運算的特點并結合假設,是以echo "$UserName exists.為真。
2假設使用者不存在,對其取反! id $UserName為真,根據與運算的特點并結合假設,是以 useradd $UserName 為真。根據或運算的特點結合已知得到echo "$UserName exists為假。
id $UserName &> /dev/null && echo "$UserName exists." || useradd $UserName
1:給定一個路徑,判斷
如果為普通檔案,顯示之;如果為目錄,顯示之;否則,說無法識别;
#!/bin/bash
if [ ! -e $1 ]; then
echo "No such file."
exit 7
if [ -f $1 ]; then
echo "Common file."
elif [ -d $1 ]; then
echo "Directory."
echo "Unknown file."
本文轉自 宋鵬超 51CTO部落格,原文連結:http://blog.51cto.com/qidian510/1253358,如需轉載請自行聯系原作者