說明:本文部分內(nèi)容均摘取自書籍《Linux命令行與shell腳本編程大全》,版權歸原作者所有?!禠inux命令行與shell腳本編程大全》(第三版)第十三章學習總結(jié)
第十三章:更多的結(jié)構化命令
本章內(nèi)容
for循環(huán)語句
until迭代語句使用while語句
循環(huán)
重定向循環(huán)的輸出
13.1 for命令
命令格式
for var in list
do
commands
done
命令說明:變量var為list中的迭代值,在do和done語句之間輸入的命令可以是一條或多條標準的bash shell命令。
13.1.1 讀取列表中的值
for命令最基本的用法就是遍歷for命令自身所定義的一系列值
編寫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"
13.1.2 讀取列表中的復雜值
for循環(huán)假定每個值都是用空格分割的
當某個值有特殊字符時,需要進行轉(zhuǎn)義
可以使用轉(zhuǎn)義字符(反斜線)和雙引號
當某個值包含空格時,需使用雙引號
編寫test2.sh腳本
#!/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
13.1.3 從變量讀取列表
編寫test4.sh腳本
#!/bin/bash
list="One Two Three"
list=$list" Four"
for number in $list
do
echo "The number is $number"
done
13.1.4 從命令讀取值
生成列表中所需值的另外一個途徑就是使用命令的輸出
可以用命令來替換執(zhí)行任何能產(chǎn)生輸出的命令
然后在for命令中使用該命令的輸出
編寫number文本
One
Two
Three
編寫test5.sh腳本
#!/bin/bash
file="number"
for number in $(cat $file)
do
echo "The number is $number"
done
13.1.5 更改字段分隔符
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
13.1.6 用通配符讀取目錄
可以使用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
13.2 C語言風格的for命令
13.2.1 C語言的for命令
C語言for格式
for (i=0;i<10;i++)
{
printlf("The next number is $d\n",i);
}
bash中C語言風格的for循環(huán)格式
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
13.2.2 使用多個變量
編寫test9.sh腳本
#!/bin/bash
for(( a=1,b=10;a<=10;a++,b-- ))
do
echo "$a - $b"
done
13.3 while命令
13.3.1 while的基本格式
命令格式
while test command
do
other commands
done
命令說明
while命令中定義的test command和if-then語句中的格式一模一樣
while命令的關鍵在于所指定的test command的退出狀態(tài)碼必須隨著循環(huán)中運行的命令而改變
如果退出狀態(tài)碼不發(fā)生變化,while循環(huán)將一直不停的進行下去
編寫test10.sh腳本
#!/bin/bash
var1=10
while [ $var1 -gt 0 ]
do
echo $var1
var1=$[ $var1 - 1 ]
done
13.3.2 使用多個測試命令
while命令允許你在while語句定義多個測試條件
只有最后一個測試條件的退出狀態(tài)嗎會被用來決定什么時候結(jié)束循環(huán)
注意,每個測試命令都出現(xiàn)在單獨的一行上
編寫test11.sh腳本
#!/bin/bash
var1=10
while echo $var1
[ $var1 -ge 0 ]
do
echo "The is inside the loop"
var1=$[ $var1 - 1 ]
done
13.4 until命令
命令格式
until test commands
do
other commands
done
命令說明
until命令和while命令工作的方式完全相反
untile命令要求你指定一個通常返回非零退出狀態(tài)碼的測試命令
只有測試命令的退出狀態(tài)碼不為0,bash shell才會執(zhí)行循環(huán)中列出的命令
一旦測試命令返回了退出狀態(tài)碼0,循環(huán)就結(jié)束了
編寫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
13.5 嵌套循環(huán)
循環(huán)語句可以在循環(huán)內(nèi)使用任意類型的命令,包括其他循環(huán)命令
編寫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
13.6 循環(huán)處理文件數(shù)據(jù)
通常必須遍歷存儲在文件中的數(shù)據(jù),這需要結(jié)合以下技術實現(xiàn)
使用嵌套循環(huán):再次利用循環(huán)來讀取每一行中的數(shù)據(jù)
修改IFS環(huán)境變量:強制for命令將文件中的每行都當成單獨的一個條目來處理
13.7 控制循環(huán)
13.7.1 break命令
用break命令來退出任意類型的循環(huán),包括while和until循環(huán)
1.跳出單個循環(huán)
編寫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.跳出內(nèi)部循環(huán)
編寫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.跳出外部循環(huán)
編寫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
13.7.2 continue命令
編寫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
13.8 處理循環(huán)的輸出
通過在done命令之后添加一個處理命令來實現(xiàn)將循環(huán)的輸出使用管道或進行重定向
編寫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"
13.9 實例
13.9.1 查找可執(zhí)行文件
編寫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
13.9.2 創(chuàng)建多個用戶賬戶
編寫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
13.10 小結(jié)
bash shell提供了三種可用于腳本中的循環(huán)命令
for命令允許你遍歷一系列的值
while命令提供基于命令條件的循環(huán)
until命令建立在命令或條件產(chǎn)生非零退出狀態(tài)碼的基礎上