目錄:
- printf 命令
- if...else語句
- case ... esac 語句
- for循環(huán)
- while循環(huán)
- until 循環(huán)
- continue、break
1蚯妇、printf 命令
printf 命令用于格式化輸出豺憔, 是echo命令的增強(qiáng)版忿晕。它是C語言printf()庫函數(shù)的一個(gè)有限的變形凡恍,并且在語法上有些不同,移植性要比 echo 好漠魏。
如同 echo 命令,printf 命令也可以輸出簡(jiǎn)單的字符串:
printf "Hello, world\n"
printf 不像 echo 那樣會(huì)自動(dòng)換行妄均,必須顯式添加換行符(\n)
printf命令的語法:
printf format-string [arguments...]format-string
為格式控制字符串柱锹,
arguments `為參數(shù)列表。
printf 命令不用加括號(hào)
format-string 可以沒有引號(hào)丰包,但最好加上禁熏,單引號(hào)雙引號(hào)均可。
參數(shù)多于格式控制符(%)時(shí)邑彪,format-string 可以重用瞧毙,可以將所有參數(shù)都轉(zhuǎn)換。
arguments 使用空格分隔寄症,不用逗號(hào)宙彪。
示例:
#雙引號(hào)
printf "%d -- %s\n" 11 "哈哈"
#單引號(hào)和雙引號(hào)效果一樣
printf '%d -- %s\n' 11 "哈哈"
#也可以不寫引號(hào)
printf %s "哈哈"
# 格式只指定了一個(gè)參數(shù),但多出的參數(shù)仍然會(huì)按照該格式輸出有巧,format-string 被重用
printf "%s\n" abc def
printf "%s and %d \n"
# 如果以 %d 的格式來顯示字符串释漆,那么會(huì)有警告,提示無效的數(shù)字篮迎,此時(shí)默認(rèn)置為 0
printf "'%s , %d\n'" Hello Shell
輸出:
11 -- 哈哈
11 -- 哈哈
哈哈abc
def
and 0
./test.sh: line 11: printf: Shell: invalid number
'Hello , 0
注意男图,根據(jù)POSIX標(biāo)準(zhǔn)示姿,浮點(diǎn)格式%e、%E逊笆、%f峻凫、%g與%G是“不需要被支持”。這是因?yàn)閍wk支持浮點(diǎn)預(yù)算览露,且有它自己的printf語句荧琼。這樣Shell程序中需要將浮點(diǎn)數(shù)值進(jìn)行格式化的打印時(shí),可使用小型的awk程序?qū)崿F(xiàn)差牛。然而命锄,內(nèi)建于bash、ksh93和zsh中的printf命令都支持浮點(diǎn)格式偏化。
2脐恩、if...else語句
if 語句通過關(guān)系運(yùn)算符判斷表達(dá)式的真假來決定執(zhí)行哪個(gè)分支。Shell 有三種 if ... else 語句:
- if ... fi 語句侦讨;
- if ... else ... fi 語句汽抚;
- if ... elif ... else ... fi 語句。
if ... else 語句
if ... else
語句的語法:
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
最后必須以fi
來結(jié)尾閉合 if再扭,fi
就是 if 倒過來拼寫着撩,后面也會(huì)遇見。
注意:expression 和方括號(hào)([ ])之間必須有空格
沈条,否則會(huì)有語法錯(cuò)誤需忿。
示例:
a=10
b=20
if [ $a == $b ]
then
echo "a、b相等"
fi
if [ $a != $b ]
then
echo "a蜡歹、b不相等"
fi
輸出
a屋厘、b不相等
if ... else ... fi 語句
if ... else ... fi
語句的語法:
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
示例:
a=10
b=20
if [ $a == $b ]
then
echo "a、b相等"
else
echo "a月而、b不相等"
fi
輸出:
a汗洒、b不相等
if ... elif ... fi 語句
if ... elif ... fi
語句可以對(duì)多個(gè)條件進(jìn)行判斷,語法為:
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi
示例:
a=10
b=20
if [ $a == $b ]
then
echo "a等于b"
elif [ $a -gt $b ]
then
echo "a大于b"
else
echo "a小于b"
fi
輸出:
a小于b
if ... else
語句也可以寫成一行,如果同一行有多條語句需要分號(hào)父款,以命令的方式來運(yùn)行:
a=10
b=10
if test $a -eq $b; then echo 'a溢谤、b相等!'; fi;
if ... else
語句也經(jīng)常與test
命令結(jié)合使用,如下所示:
a=$[2*3]
b=$[1+5]
if test $a -eq $b
then
echo 'a铛漓、b相等!'
else
echo 'a溯香、b不等'
fi;
test
命令用于檢查某個(gè)條件是否成立,與方括號(hào)([ ])類似
3浓恶、case ... esac 語句
case ... esac
與其他語言中的 switch ... case
語句類似玫坛,是一種多分枝選擇結(jié)構(gòu)。
case
語句匹配一個(gè)值或一個(gè)模式包晰,如果匹配成功湿镀,執(zhí)行相匹配的命令炕吸。case
語句格式如下:
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
case
工作方式如上所示。取值后面必須為關(guān)鍵字 in
勉痴,每一模式必須以右括號(hào)結(jié)束赫模。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后蒸矛,其間所有命令開始執(zhí)行直至;;
瀑罗。;;
與其他語言中的 break
類似,意思是跳到整個(gè)case
語句的最后雏掠。
取值將檢測(cè)匹配的每一個(gè)模式斩祭。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式乡话。如果無一匹配模式摧玫,使用星號(hào) * 捕獲該值,再執(zhí)行后面的命令绑青。
示例:
#!/bin/sh
echo "請(qǐng)輸入數(shù)字1~3"
read inputNum
case $inputNum in
1) echo "輸入的是1"
;;
2) echo "輸入的是2"
;;
3) echo "輸入的的3"
;;
*) echo "無效數(shù)字"
;;
esac
輸出:
請(qǐng)輸入數(shù)字1~3
2
輸入的是2
實(shí)例二:
#!/bin/sh
option="${1}"
case ${option} in
-f) FILE="${2}"
echo "File name is $FILE"
;;
-d) DIR="${2}"
echo "Dir name is $DIR"
;;
*)
echo "`basename ${0}`:usage: [-f file] | [-d directory]"
exit 1 # Command to come out of the program with status 1
;;
esac
輸出:
Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -f fileName
File name is fileName
Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -d directoryName
Dir name is directoryName
4诬像、for循環(huán)
for循環(huán)一般格式為:
for 變量 in 列表
do
command1
command2
...
commandN
done
列表是一組值(數(shù)字、字符串等)組成的序列闸婴,每個(gè)值通過空格分隔坏挠。每循環(huán)一次,就將列表中的下一個(gè)值賦給變量掠拳。
in
列表是可選的癞揉,如果不用它,for
循環(huán)使用命令行的位置參數(shù)溺欧。
示例一:
for num in 1 2 3 4
do
echo "num is $num"
done
輸出
num is 1
num is 2
num is 3
num is 4
示例二:
array=(1 2 3 4 5)
for a in ${array[*]}
do
echo ${a}
done
輸出:
1
2
3
4
5
實(shí)例三:
#順序輸出字符串中的字符
for c in 'hello world'
do
echo $c
done
輸出:
hello world
示例四
#查看當(dāng)前目錄有哪些jpg圖片
currentDir=`pwd`
for file in ${currentDir}/*.jpg
do
echo $file
done
輸出:
/Users/chenzhichao/desktop/11.jpg
五、while循環(huán)
while循環(huán)用于不斷執(zhí)行一系列命令柏肪,也用于從輸入文件中讀取數(shù)據(jù)姐刁;命令通常為測(cè)試條件。其格式為:
while command
do
Statement(s) to be executed if command is true
done
示例:
num=5
while [ $num -gt 0 ]
do
echo $num
num=`expr $num - 1`
done
輸出:
5
4
3
2
1
實(shí)例二:
echo "同時(shí)按ctrl+D結(jié)束"
echo "輸入信息:"
while read message
do
echo "信息:$message"
done
輸出:
同時(shí)按ctrl+D結(jié)束
輸入信息:
你好啊烦味,**
信息:你好啊聂使,**
六、until 循環(huán)
until
循環(huán)執(zhí)行一系列命令直至條件為true
時(shí)停止谬俄。until
循環(huán)與 while
循環(huán)在處理方式上剛好相反柏靶。一般while
循環(huán)優(yōu)于until
循環(huán),但在某些時(shí)候溃论,也只是極少數(shù)情況下屎蜓,until
循環(huán)更加有用。
until
循環(huán)格式為:
until command
do
Statement(s) to be executed until command is true
done
command 一般為條件表達(dá)式钥勋,如果返回值為 false炬转,則繼續(xù)執(zhí)行循環(huán)體內(nèi)的語句辆苔,否則跳出循環(huán)。
示例:
#!/bin/sh
a=0
until [ ! $a -lt 5 ]
do
echo $a
a=`expr $a + 1`
done
輸出:
0
1
2
3
4
七扼劈、continue驻啤、break
在循環(huán)過程中,有時(shí)候需要在未達(dá)到循環(huán)結(jié)束條件時(shí)強(qiáng)制跳出循環(huán)荐吵,像大多數(shù)編程語言一樣骑冗,Shell也使用 break
和 continue
來跳出循環(huán)。
break命令
break
命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))先煎。
示例:
echo "輸入數(shù)字1~5贼涩,輸入其他數(shù)字不做處理"
while read num
do
if [ $num -gt 0 -a $num -lt 6 ]
then
echo "輸入的是$num"
else
echo "無效字符,退出"
break
fi
done
輸出:
輸入數(shù)字1~5,輸入其他數(shù)字不做處理
1
輸入的是1
5
輸入的是5
6
無效字符,退出
在嵌套循環(huán)中榨婆,break
命令后面還可以跟一個(gè)整數(shù)磁携,表示跳出第幾層循環(huán)。例如:
break n
表示跳出第 n 層循環(huán)
示例
for var1 in 1 2 3
do
for var2 in 0 5
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2
else
echo "$var1 $var2"
fi
done
done
輸出:
1 0
1 5
continue命令
continue
命令與break
命令類似良风,只有一點(diǎn)差別谊迄,它不會(huì)跳出所有循環(huán),僅僅跳出當(dāng)前循環(huán)烟央。
示例:
for num in 1 2 3 4 5
do
if [ $num == 3 ]
then
continue
fi
echo "num is $num"
done
輸出:
num is 1
num is 2
num is 4
num is 5