shell腳本學(xué)習(xí)(三)

目錄:

  • 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也使用 breakcontinue來跳出循環(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末统诺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子疑俭,更是在濱河造成了極大的恐慌粮呢,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞艇,死亡現(xiàn)場(chǎng)離奇詭異啄寡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哩照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門挺物,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人飘弧,你說我怎么就攤上這事识藤。” “怎么了次伶?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵痴昧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我冠王,道長(zhǎng)赶撰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮扣囊,結(jié)果婚禮上乎折,老公的妹妹穿的比我還像新娘。我一直安慰自己侵歇,他們只是感情好骂澄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惕虑,像睡著了一般坟冲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溃蔫,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天健提,我揣著相機(jī)與錄音,去河邊找鬼伟叛。 笑死私痹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的统刮。 我是一名探鬼主播紊遵,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼侥蒙!你這毒婦竟也來了暗膜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤鞭衩,失蹤者是張志新(化名)和其女友劉穎学搜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體论衍,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑞佩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坯台。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钉凌。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖捂人,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情矢沿,我是刑警寧澤滥搭,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站捣鲸,受9級(jí)特大地震影響瑟匆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栽惶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一愁溜、第九天 我趴在偏房一處隱蔽的房頂上張望疾嗅。 院中可真熱鬧,春花似錦冕象、人聲如沸代承。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽论悴。三九已至,卻和暖如春墓律,著一層夾襖步出監(jiān)牢的瞬間膀估,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工耻讽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留察纯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓针肥,卻偏偏與公主長(zhǎng)得像饼记,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祖驱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容