for
循環
bash shell
中for
循環的基本格式:
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
#--------執行腳本------
#輸出:I
#輸出:don't
#輸出:know
#輸出:New
#輸出:York
注意點:
$item
變量的值會保持最后一次迭代的值,并在shell
腳本的剩余部分一直保持有效,除非我們修改。列表中的值含有特殊符號如:
'
,:
,;
,空格等時,需要特殊處理,否則會執行異常。有兩種處理方式:
第一種,采用轉義符\
轉義特殊字符;
第二種,使用雙引號來定義列表中用到特殊字符的值。for
循環默認假定列表中的每個值都是使用空格分割的。
上述I don\'t know New York
中New York
屬于列表中包含多個詞的值,因此若需正常顯示,應當進行轉義或雙引號修飾:
#! /bin/bash
#控制流
for item in I "don't" know "New York"
#或: for item in I don\'t know New\ York
do
echo 輸出:$item
done
#--------執行腳本------
輸出:I
輸出:don't
輸出:know
輸出:New York
關于bash shell
的字段分隔符
bash shell
有個特殊的環境變量IFS
,叫:內部字段分隔符,全稱:internal field separator
。
IFS
作用:如果bash shell
在數據中看到了這些字符中的任意一個,它就會假定這表明了列表中一個新數據字段的開始。
IFS
的默認值為:空格、制表符、換行符。
基于上述理解,我們假定文件test_file
中的數據如下:
Bei Jing
is
beautiful city
編寫for
循環讀取test_file
文件內容的腳本:
#!/bin/bash
#字段分隔符測試
#命令替換兩種方式:1.``;2.$();
for item in `cat test_file`
do
echo 輸出:$item
done
根據IFS
的默認分隔符,執行的最終結果,顯示為:
輸出:Bei
輸出:Jing
輸出:is
輸出:beautiful
輸出:city
那如何像文件中那樣進行輸出呢,答案:修改IFS
環境變量只為換行符;
#!/bin/bash
#字段分隔符測試
#命令替換兩種方式:1.``;2.$();
IFS=$'\n'
for item in `cat test_file`
do
echo 輸出:$item
done
#--------執行腳本------
#輸出:Bei Jing
#輸出:is
#輸出:beautiful city
修改test_file
文件內容:
Bei:Jing
is
beautiful;city
期望腳本輸出時,每個單詞為一個數據字段,則IFS
需要指定多個分隔字符,腳本如下:
#!/bin/bash
#字段分隔符測試
#命令替換兩種方式:1.``;2.$();
IFS=$'\n':';'
for item in `cat test_file`
do
echo 輸出:$item
done
結果顯示
輸出:Bei
輸出:Jing
輸出:is
輸出:beautiful
輸出:city
for
循環遍歷文件目錄
可以用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
會將額外的單詞當作參數,從而會造成錯誤,解決辦法:將$file
變量用雙引號圈起來。
C
語言風格的for
循環
基本格式如下:
for (( variable assignment ; condition ; iteration process ))
do
commands
done
簡單類比如下:
for((a = 0; a < 10; a ++))
注意點:
- 變量賦值可以有空格;
- 條件中的變量不以美元符開頭;
- 迭代過程的算式未用expr命令格式;
示例:
#! /bin/bash
#`C`語言風格的`for`循環
for (( i = 0;i<10;i++))
do
echo 數字$i
done
多變量示例:
#! /bin/bash
#`C`語言風格的`for`循環
for (( i = 0,j=10;i<10,j>7;i++,j--))
do
echo j與i的差值$j-$i
done
#-----------執行輸出-----------
#j與i的差值10-0
#j與i的差值9-1
#j與i的差值8-2
while
循環
while
循環基本格式如下:
while test command
do
other commands
done
test
命令返回非零while
循環停止。
示例:
#! /bin/bash
#`while`循環
x=10
while [ $x -gt 7 ]
do
echo 輸出$x
#bash兼容sh,故整型算術運算基本格式:`$[ ]`
x=$[$x-1]
done
#-----執行結果-----
#輸出10
#輸出9
#輸出8
until
循環
until
循環與while
循環相反,基本格式如下:
until test command
do
other commands
done
基本語義為:執行other commands
直到command
成立才終止。即test
命令返回零或執行成功,循環才會結束。
示例:
#! /bin/bash
#`until `循環
x=10
until [ $x -le 7 ] #直到x小于等于7,循環結束
do
echo 輸出$x
x=$[$x-1]
done
#----------執行腳本輸出------------
#輸出10
#輸出9
#輸出8
循環嵌套
#!/bin/bash
# 嵌套循環,for循環嵌套for循環
for (( a = 1; a <= 2; a++ ))
do
echo "外部循環 $a:"
for (( b = 1; b <= 2; b++ ))
do
echo " 內部循環: $b"
done
done
#-----------執行輸出---------------
外部循環 1:
內部循環: 1
內部循環: 2
外部循環 2:
內部循環: 1
內部循環: 2
控制循環
控制循環主要使用break
和continue
,這兩個關鍵字使用方法和其他語言類似,這里我們只闡述一些區別和注意點:
- break:可以退出任意類型的循環。
1.在處理多個循環時,
break
命令會自動終止其所在的最內層的循環。
示例如下:
#!/bin/bash
# 嵌套循環,for循環嵌套for循環
for (( a = 1; a <= 2; a++ ))
do
echo "外部循環 $a:"
for (( b = 1; b <= 2; b++ ))
do
if [ $b -eq 2 ];then
break
fi
echo " 內部循環: $b"
done
done
#---------執行輸出----------
外部循環 1:
內部循環: 1
外部循環 2:
內部循環: 1
2.在內部循環中,需要終止外部循環時,可以采用
break n
的方式,其中n
表示要跳出的循環層級,默認情況下n
為1,如果將n
設為2,break
命令就會終止下一次的外部循環。
示例如下:
#!/bin/bash
# 嵌套循環,for循環嵌套for循環
for (( a = 1; a <= 2; a++ ))
do
echo "外部循環 $a:"
for (( b = 1; b <= 2; b++ ))
do
if [ $b -eq 2 ];then
break 2
fi
echo " 內部循環: $b"
done
done
#------------執行輸出-------------
外部循環 1:
內部循環: 1
- continue:可以提前中止某次循環,但并不會完全終止整個循環。
重定向循環的輸出到文件或命令
重定向循環的輸出,示例如下:
#!/bin/bash
# 重定向循環的輸出
for (( a = 1; a <= 2; a++ ))
do
echo "循環輸出 $a"
done > test.txt
#-------test.txt文件內容-------
循環輸出 1
循環輸出 2
文件內容輸入到循環,示例如下:
#文件內容
你好;世界
hello,world
hi:ios
腳本以及執行輸出
#!/bin/bash
# 重定向輸入到循環
while IFS=",:;" read -r x y
do
echo $x - $y
done < test.txt
#-------執行輸出-------
#你好 - 世界
#hello - world
#hi - ios
參考資料:
Linux命令行與shell腳本編程大全