for
循環(huán)
bash shell
中for
循環(huán)的基本格式:
for var in list
do
commands
done
也可以將
do
語句和for
語句放在同一行貌笨,但必須用分號將其同列表中的值分開:for var in list; do
使用示例:
#! /bin/bash
#控制流
for item in I don\'t know New York
do
echo 輸出:$item
done
#--------執(zhí)行腳本------
#輸出:I
#輸出:don't
#輸出:know
#輸出:New
#輸出:York
注意點:
$item
變量的值會保持最后一次迭代的值苛蒲,并在shell
腳本的剩余部分一直保持有效,除非我們修改盖彭。列表中的值含有特殊符號如:
'
,:
焊唬,;
豫缨,空格等時,需要特殊處理摔桦,否則會執(zhí)行異常社付。有兩種處理方式:
第一種,采用轉(zhuǎn)義符\
轉(zhuǎn)義特殊字符邻耕;
第二種鸥咖,使用雙引號來定義列表中用到特殊字符的值。for
循環(huán)默認假定列表中的每個值都是使用空格分割的兄世。
上述I don\'t know New York
中New York
屬于列表中包含多個詞的值扛或,因此若需正常顯示,應(yīng)當進行轉(zhuǎn)義或雙引號修飾:
#! /bin/bash
#控制流
for item in I "don't" know "New York"
#或: for item in I don\'t know New\ York
do
echo 輸出:$item
done
#--------執(zhí)行腳本------
輸出:I
輸出:don't
輸出:know
輸出:New York
關(guān)于bash shell
的字段分隔符
bash shell
有個特殊的環(huán)境變量IFS
碘饼,叫:內(nèi)部字段分隔符,全稱:internal field separator
悲伶。
IFS
作用:如果bash shell
在數(shù)據(jù)中看到了這些字符中的任意一個艾恼,它就會假定這表明了列表中一個新數(shù)據(jù)字段的開始。
IFS
的默認值為:空格麸锉、制表符钠绍、換行符。
基于上述理解花沉,我們假定文件test_file
中的數(shù)據(jù)如下:
Bei Jing
is
beautiful city
編寫for
循環(huán)讀取test_file
文件內(nèi)容的腳本:
#!/bin/bash
#字段分隔符測試
#命令替換兩種方式:1.``;2.$();
for item in `cat test_file`
do
echo 輸出:$item
done
根據(jù)IFS
的默認分隔符柳爽,執(zhí)行的最終結(jié)果媳握,顯示為:
輸出:Bei
輸出:Jing
輸出:is
輸出:beautiful
輸出:city
那如何像文件中那樣進行輸出呢,答案:修改IFS
環(huán)境變量只為換行符磷脯;
#!/bin/bash
#字段分隔符測試
#命令替換兩種方式:1.``;2.$();
IFS=$'\n'
for item in `cat test_file`
do
echo 輸出:$item
done
#--------執(zhí)行腳本------
#輸出:Bei Jing
#輸出:is
#輸出:beautiful city
修改test_file
文件內(nèi)容:
Bei:Jing
is
beautiful;city
期望腳本輸出時蛾找,每個單詞為一個數(shù)據(jù)字段,則IFS
需要指定多個分隔字符赵誓,腳本如下:
#!/bin/bash
#字段分隔符測試
#命令替換兩種方式:1.``;2.$();
IFS=$'\n':';'
for item in `cat test_file`
do
echo 輸出:$item
done
結(jié)果顯示
輸出:Bei
輸出:Jing
輸出:is
輸出:beautiful
輸出:city
for
循環(huán)遍歷文件目錄
可以用for
命令來自動遍歷目錄中的文件打毛。進行此操作時,必須在文件名或路徑名中使用通配符:*
俩功。
#!/bin/bash
#遍歷文件目錄
filePath=~/desktop/compare/*
for file in $filePath
do
if [ -f "$file" ];then
echo $file 是文件
elif [ -d "$file" ]
then
echo $file 是目錄
else
echo 其他
fi
done
注意:目錄或文件名中是可以包含空格的幻枉,在test
命令中,bash shell
會將額外的單詞當作參數(shù)诡蜓,從而會造成錯誤熬甫,解決辦法:將$file
變量用雙引號圈起來。
C
語言風(fēng)格的for
循環(huán)
基本格式如下:
for (( variable assignment ; condition ; iteration process ))
do
commands
done
簡單類比如下:
for((a = 0; a < 10; a ++))
注意點:
- 變量賦值可以有空格;
- 條件中的變量不以美元符開頭;
- 迭代過程的算式未用expr命令格式蔓罚;
示例:
#! /bin/bash
#`C`語言風(fēng)格的`for`循環(huán)
for (( i = 0;i<10;i++))
do
echo 數(shù)字$i
done
多變量示例:
#! /bin/bash
#`C`語言風(fēng)格的`for`循環(huán)
for (( i = 0,j=10;i<10,j>7;i++,j--))
do
echo j與i的差值$j-$i
done
#-----------執(zhí)行輸出-----------
#j與i的差值10-0
#j與i的差值9-1
#j與i的差值8-2
while
循環(huán)
while
循環(huán)基本格式如下:
while test command
do
other commands
done
test
命令返回非零while
循環(huán)停止椿肩。
示例:
#! /bin/bash
#`while`循環(huán)
x=10
while [ $x -gt 7 ]
do
echo 輸出$x
#bash兼容sh,故整型算術(shù)運算基本格式:`$[ ]`
x=$[$x-1]
done
#-----執(zhí)行結(jié)果-----
#輸出10
#輸出9
#輸出8
until
循環(huán)
until
循環(huán)與while
循環(huán)相反脚粟,基本格式如下:
until test command
do
other commands
done
基本語義為:執(zhí)行other commands
直到command
成立才終止覆旱。即test
命令返回零或執(zhí)行成功,循環(huán)才會結(jié)束核无。
示例:
#! /bin/bash
#`until `循環(huán)
x=10
until [ $x -le 7 ] #直到x小于等于7扣唱,循環(huán)結(jié)束
do
echo 輸出$x
x=$[$x-1]
done
#----------執(zhí)行腳本輸出------------
#輸出10
#輸出9
#輸出8
循環(huán)嵌套
#!/bin/bash
# 嵌套循環(huán),for循環(huán)嵌套for循環(huán)
for (( a = 1; a <= 2; a++ ))
do
echo "外部循環(huán) $a:"
for (( b = 1; b <= 2; b++ ))
do
echo " 內(nèi)部循環(huán): $b"
done
done
#-----------執(zhí)行輸出---------------
外部循環(huán) 1:
內(nèi)部循環(huán): 1
內(nèi)部循環(huán): 2
外部循環(huán) 2:
內(nèi)部循環(huán): 1
內(nèi)部循環(huán): 2
控制循環(huán)
控制循環(huán)主要使用break
和continue
团南,這兩個關(guān)鍵字使用方法和其他語言類似噪沙,這里我們只闡述一些區(qū)別和注意點:
- break:可以退出任意類型的循環(huán)。
1.在處理多個循環(huán)時吐根,
break
命令會自動終止其所在的最內(nèi)層的循環(huán)正歼。
示例如下:
#!/bin/bash
# 嵌套循環(huán),for循環(huán)嵌套for循環(huán)
for (( a = 1; a <= 2; a++ ))
do
echo "外部循環(huán) $a:"
for (( b = 1; b <= 2; b++ ))
do
if [ $b -eq 2 ];then
break
fi
echo " 內(nèi)部循環(huán): $b"
done
done
#---------執(zhí)行輸出----------
外部循環(huán) 1:
內(nèi)部循環(huán): 1
外部循環(huán) 2:
內(nèi)部循環(huán): 1
2.在內(nèi)部循環(huán)中拷橘,需要終止外部循環(huán)時局义,可以采用
break n
的方式,其中n
表示要跳出的循環(huán)層級冗疮,默認情況下n
為1萄唇,如果將n
設(shè)為2,break
命令就會終止下一次的外部循環(huán)术幔。
示例如下:
#!/bin/bash
# 嵌套循環(huán)另萤,for循環(huán)嵌套for循環(huán)
for (( a = 1; a <= 2; a++ ))
do
echo "外部循環(huán) $a:"
for (( b = 1; b <= 2; b++ ))
do
if [ $b -eq 2 ];then
break 2
fi
echo " 內(nèi)部循環(huán): $b"
done
done
#------------執(zhí)行輸出-------------
外部循環(huán) 1:
內(nèi)部循環(huán): 1
- continue:可以提前中止某次循環(huán),但并不會完全終止整個循環(huán)。
重定向循環(huán)的輸出到文件或命令
重定向循環(huán)的輸出四敞,示例如下:
#!/bin/bash
# 重定向循環(huán)的輸出
for (( a = 1; a <= 2; a++ ))
do
echo "循環(huán)輸出 $a"
done > test.txt
#-------test.txt文件內(nèi)容-------
循環(huán)輸出 1
循環(huán)輸出 2
文件內(nèi)容輸入到循環(huán)泛源,示例如下:
#文件內(nèi)容
你好;世界
hello,world
hi:ios
腳本以及執(zhí)行輸出
#!/bin/bash
# 重定向輸入到循環(huán)
while IFS=",:;" read -r x y
do
echo $x - $y
done < test.txt
#-------執(zhí)行輸出-------
#你好 - 世界
#hello - world
#hi - ios
參考資料:
Linux命令行與shell腳本編程大全