時間:2017年09月13日星期三
說明:本文部份內容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原做者全部。《Linux命令行與shell腳本編程大全》(第三版)第十三章學習總結shell
本章內容編程
for循環語句 until迭代語句使用while語句 循環 重定向循環的輸出
命令格式bash
for var in list do commands done
命令說明:變量var爲list中的迭代值,在do和done語句之間輸入的命令能夠是一條或多條標準的bash shell命令。ide
for命令最基本的用法就是遍歷for命令自身所定義的一系列值oop
編寫test1.sh腳本學習
#!/bin/bash for test in One The Three Four Five Six do echo "The next number is $test" done
編寫test1b.sh腳本測試
#!/bin/bash for test in One The Three Four Five Six do echo "The next number is $test" done echo "The last number is $test" test=Seven echo "Now, Test number is $test"
for循環假定每一個值都是用空格分割的 當某個值有特殊字符時,須要進行轉義 可使用轉義字符(反斜線)和雙引號 當某個值包含空格時,需使用雙引號
編寫test2.sh腳本this
#!/bin/bash for test in I don\'t know "this'll" work do echo "word:$test" done
編寫test3.sh腳本命令行
#!/bin/bash for test in Nevada "New Hampshire" "New Mexico" "New York" do echo "Now going to $test" done
編寫test4.sh腳本code
#!/bin/bash list="One Two Three" list=$list" Four" for number in $list do echo "The number is $number" done
生成列表中所需值的另一個途徑就是使用命令的輸出 能夠用命令來替換執行任何能產生輸出的命令 而後在for命令中使用該命令的輸出
編寫number文本
One Two Three
編寫test5.sh腳本
#!/bin/bash file="number" for number in $(cat $file) do echo "The number is $number" done
bash shell會將空格/製表符/換行符當作字段分割符
使用換行符做爲字段分隔符IFS=$'\n' 則bash shell會忽略空格和製表符 也能夠自定義使用特定字符做爲字段分隔符
編寫test5b.sh腳本
#!/bin/bash file="number" IFS=$'\n' for number in $(cat $file) do echo "The number is $number" done
可使用for命令來自動遍歷目錄中的文件
編寫test6.sh腳本
#!/bin/bash for file in /home/zc/test/unit13/* do if [ -d "$file" ] then echo "$file is a directory" elif [ -f "$file" ] then echo "$file is a file" fi done
編寫test7.sh腳本
#!/bin/bash for file in /home/zc/test/unit13/*.sh /home/zc/test/unit12 do if [ -d "$file" ] then echo "$file is a directory" elif [ -f "$file" ] then echo "$file is a file" fi done
C語言for格式
for (i=0;i<10;i++) { printlf("The next number is $d\n",i); }
bash中C語言風格的for循環格式
for (( variable assignment ; condition ; iteration process )) 變量賦值能夠有空格 條件中的變量不能夠美圓符開頭 迭代過程的算式未用expr命令格式
編寫test8.sh腳本
#!/bin/bash for (( i=1; i<=10;i++ )) do echo "The next number is $i" done
編寫test9.sh腳本
#!/bin/bash for(( a=1,b=10;a<=10;a++,b-- )) do echo "$a - $b" done
命令格式
while test command do other commands done
命令說明
while命令中定義的test command和if-then語句中的格式如出一轍 while命令的關鍵在於所指定的test command的退出狀態碼必須隨着循環中運行的命令而改變 若是退出狀態碼不發生變化,while循環將一直不停的進行下去
編寫test10.sh腳本
#!/bin/bash var1=10 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] done
while命令容許你在while語句定義多個測試條件 只有最後一個測試條件的退出狀態嗎會被用來決定何時結束循環 注意,每一個測試命令都出如今單獨的一行上
編寫test11.sh腳本
#!/bin/bash var1=10 while echo $var1 [ $var1 -ge 0 ] do echo "The is inside the loop" var1=$[ $var1 - 1 ] done
命令格式
until test commands do other commands done
命令說明
until命令和while命令工做的方式徹底相反 untile命令要求你指定一個一般返回非零退出狀態碼的測試命令 只有測試命令的退出狀態碼不爲0,bash shell纔會執行循環中列出的命令 一旦測試命令返回了退出狀態碼0,循環就結束了
編寫test12.sh腳本
#!/bin/bash var1=100 until [ $var1 -eq 0 ] do echo $var1 var1=$[ $var1-25 ] done
編寫test13.sh腳本
#!/bin/bash var1=100 until echo $var1 [ $var1 -eq 0 ] do echo Inside the loop: $var1 var1=$[ $var1-25 ] done
循環語句能夠在循環內使用任意類型的命令,包括其餘循環命令
編寫test14.sh腳本
#!/bin/bash for (( a=1;a<=3;a++)) do echo "Starting loop $a:" for (( b=1;b<=3;b++)) do echo " Inside loop:$b" done done
編寫test15.sh腳本
#!/bin/bash var1=5 while [ $var1 -ge 0 ] do echo "Outer loog:$var1" for (( var2=1;$var2<3;var2++ )) do var3=$[ $var1 * $var2 ] echo " Inner loop:$var1*$var2=$var3" done var1=$[ $var1 - 1 ] done
編寫test16.sh腳本
#!/bin/bash var1=3 until [ $var1 -eq 0 ] do echo "Outer loop:$var1" var2=1 while [ $var2 -lt 5 ] do var3=$(echo "scale=4;$var1 / $var2" | bc) echo " Inner loop:$var1 / $var2 = $var3" var2=$[ $var2+1 ] done var1=$[ $var1 - 1 ] done
一般必須遍歷存儲在文件中的數據,這須要結合如下技術實現
使用嵌套循環:再次利用循環來讀取每一行中的數據 修改IFS環境變量:強制for命令將文件中的每行都當成單獨的一個條目來處理
用break命令來退出任意類型的循環,包括while和until循環
1.跳出單個循環
編寫test17.sh腳本
#!/bin/bash for var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo "Iteration number:$var1" done echo "The for loop is completed"
編寫test18.sh腳本
#!/bin/bash var1=1 while [ $var1 -lt 10 ] do if [ $var1 -eq 5 ] then break fi echo "Iteration:$var1" var1=$[ $var1+1 ] done echo "The while loop is completed"
2.跳出內部循環
編寫test19.sh腳本
#!/bin/bash for (( a=1;a<4;a++ )) do echo "Outer loop:$a" for (( b=1;b<100;b++ )) do if [ $b -eq 5 ] then break fi echo " Inner loop:$b" done done
3.跳出外部循環
編寫test20.sh腳本
#!/bin/bash for (( a=1;a<4;a++ )) do echo "Outer loop:$a" for(( b=1;b<100;b++ )) do if [ $b -gt 4 ] then break 2 fi echo " Inner loop:$b" done done
編寫test21.sh腳本
#!/bin/bash for (( var1=1;var1<15;var1++ )) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "Iteration number:$var1" done
編寫test22.sh腳本
#!/bin/bash for (( a=1;a<=5;a++ )) do echo "Iteration $a:" for (( b=1;b<3;b++ )) do if [ $a -gt 2 ] && [ $a -lt 4 ] then continue 2 fi var3=$[ $a * $b ] echo " The result of $a * $b = $var3" done done
經過在done命令以後添加一個處理命令來實現將循環的輸出使用管道或進行重定向
編寫test23.sh腳本
#!/bin/bash for (( a=1;a<10;a++ )) do echo "The number is $a" done > test23.txt echo "The command is finished"
編寫test24.sh腳本
#!/bin/bash for state in "North Dakota" Connecticut Illinois Alabama Tennessee do echo "$state is the next plae to go" done | sort echo "This completes our travels"
編寫test25.sh腳本
#!/bin/bash IFS=: for folder in $PATH do echo "$folder:" for file in $folder/* do if [ -x $file ] then echo " $file" fi done done
編寫test26.sh腳本
#!/bin/bash input="users.csv" while IFS=',' read -r userid name do echo "adding $userid" useradd -c "$name" -m $userid done < "$input"
編寫users.csv文件
rich,Richard Blum tim,Timothy Bresnahan
bash shell提供了三種可用於腳本中的循環命令
for命令容許你遍歷一系列的值 while命令提供基於命令條件的循環 until命令創建在命令或條件產生非零退出狀態碼的基礎上