1. for 命令
for var in list
do
commands
done
for var in list; do
commands
done
2. 讀取列表中的復(fù)雜值
如果列表中有單引號,解決方法:
1??:將單引號轉(zhuǎn)義
2??:使用雙引號來 定義包含單引號的值
原始列表
for item in I don't know if this'll work
處理后
for item in I don\'t know if "this'll" work
如果某個值包含空格,則必須將其放到雙引號內(nèi):
for item in Nevada "New York" "New Mexico"
??當(dāng)你使用雙引號引用某個值時,shell并不會將雙引號當(dāng)成值的一部分
3. 從變量中讀取值列表
list="aa bb cc"
list=$list" dd"
for item in $list
do
echo $item
done
??第二行:這是向變量中已有的字符串尾部添加文本的一種常用方法
4. 從命令中讀取值列表
cat test.txt
aa bb
cc
file="test.txt"
for item in $(cat $file)
do
echo $item
done
輸出:
aa
bb
cc
5. 更改字段分隔符
造成上述問題(aa bb輸出不在同一行答朋,但在txt文件里是在同一行保存的)的原因是特殊的環(huán)境變量 IFS(內(nèi)部字段分隔符)
IFS 環(huán)境變量定義了 bash shell 用作字段分隔符的一系列字符。默認(rèn)情況下,bash shell 會將下列字符視為字段分隔符:
1??:空格
2??:制表符
3??:換行符
在腳本中臨時更改 IFS 的方法:
IFS=$'\n' # 只識別換行符
IFS=$':' # 只識別冒號
IFS=$'\n:;"' # 將換行符卿樱、冒號、分號和雙引號作為字段分隔符
6. 使用通配符讀取目錄
for file in /home/jxc/*
也可以在 for 命令中列出多個目錄通配符:
for file in /home/jxc/* /home/pmy/*
7. 仿 C語言的 for 命令
for (( i=1; i <= 10; i++ ))
do
echo $i
done
8. 使用多個變量
for (( a=1, b=10; a <= 10; a++, b-- ))
do
done
??:只能在 for 循環(huán)中定義一種迭代條件(a<=10)
9. while 命令基本格式
while test command
do
done
while [ command ]
do
done
??:test command 的退出狀態(tài)碼必須隨著循環(huán)中執(zhí)行的命令而改變硫椰,不然就會陷入死循環(huán)
10. 使用多個測試命令
??:只有最后一個測試命令的退出狀態(tài)碼會被用于決定是否結(jié)束循環(huán)
var=10
while echo $var
[ $var -ge 0 ]
do
var=$[ $var - 1 ]
done
11. until 命令
until 命令與 while 命令相反繁调,只有(最后一個命令的)退出狀態(tài)碼不為0,就會繼續(xù)執(zhí)行循環(huán)靶草。
換種說法:(最后一個命令的)退出狀態(tài)碼為0時蹄胰,會結(jié)束循環(huán)。
12. 循環(huán)控制-break命令
break 命令會跳出當(dāng)前循環(huán)奕翔。
break 命令接受單個命令行參數(shù):break n
默認(rèn) n=1裕寨,表明跳出的是當(dāng)前循環(huán)。如果將n設(shè)為2糠悯,那么break命令就會停止下一級的外層循環(huán)帮坚。
13. 循環(huán)控制-continue命令
continue 命令會結(jié)束本次循環(huán),進(jìn)入下一次循環(huán)互艾。
同理continue n
當(dāng) n=2 時试和,會直接進(jìn)入外層的下一次循環(huán)。
14. 處理循環(huán)的輸出
可以對循環(huán)的輸出使用管道或進(jìn)行重定向
for file in /home/jxc/*
do
echo $file
done > output.txt
for file in /home/jxc/*
do
echo $file
done | sort
input="users.csv"
while IFS=',' read -r loginname name
do
echo $loginname
done < "$input"