閱讀987 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Linux Shell 基礎--更多的結構化命令

for 命令
每次 for 命令遍曆值列表,它都會將列表中的下個值賦給 $test 變量。 $test 變量可以像 for
命令語句中的其他腳本變量一樣使用。在最後一次迭代後, $test 變量的值會在shell腳本的剩餘
部分一直保持有效。它會一直保持最後一次迭代的值(除非你修改了它)

for test in Alabama Alaska Arizona Arkansas California Colorado
do
        echo "The next state is $test"
done
echo "The last state we visited was $test"
test=Connecticut
echo "Wait, now we're visiting $test"

image
for 命令用空格來劃分列表中的每個值。如果在單獨的數據值中有
空格,就必須用雙引號將這些值圈起來

for test in Nevada "New Hampshire" "New Mexico" "New York"
do
        echo "Now going to $test"
done

image
從變量讀取列表

list="Alabama Alaska Arizona Arkansas Colorado"
# 拚接字符串
list=$list" Connecticut"
for state in $list
do
        echo "Have you ever visited $state?"
done

image
從命令讀取值

# 文件讀取

for state in $(cat $file)
do
        echo "Visit beautiful $state"
done

image

image
這個例子在命令替換中使用了 cat 命令來輸出文件states的內容。你會注意到states文件中每一
行有一個州,而不是通過空格分隔的。 for 命令仍然以每次一行的方式遍曆了 cat 命令的輸出,
假定每個州都是在單獨的一行上。但這並沒有解決數據中有空格的問題。如果你列出了一個名字
中有空格的州, for 命令仍然會將每個單詞當作單獨的值
更改字段分隔符
造成這個問題的原因是特殊的環境變量 IFS ,叫作內部字段分隔符(internal field separator)。
IFS 環境變量定義了bash shell用作字段分隔符的一係列字符。默認情況下,bash shell會將下列字
符當作字段分隔符:
 空格
 製表符
 換行符
如果bash shell在數據中看到了這些字符中的任意一個,它就會假定這表明了列表中一個新數
據字段的開始。在處理可能含有空格的數據(比如文件名)時,這會非常麻煩,就像你在上一個
腳本示例中看到的。
要解決這個問題,可以在shell腳本中臨時更改 IFS 環境變量的值來限製被bash shell當作字段
分隔符的字符。例如,如果你想修改 IFS 的值,使其隻能識別換行符,那就必須這麼做:
IFS=$'\n'
將這個語句加入到腳本中,告訴bash shell在數據值中忽略空格和製表符


IFS=$'\n'
for state in $(cat $file)
do
        echo "Visit beautiful $state"
done

在處理代碼量較大的腳本時,可能在一個地方需要修改 IFS 的值,然後忽略這次修改,在
腳本的其他地方繼續沿用 IFS 的默認值。一個可參考的安全實踐是在改變 IFS 之前保存原
來的 IFS 值,之後再恢複它。
這種技術可以這樣實現:
IFS.OLD=$IFS
IFS=$'\n'
<在代碼中使用新的IFS值>
IFS=$IFS.OLD
這就保證了在腳本的後續操作中使用的是 IFS 的默認值
用通配符讀取目錄

for file in /home/*
do
if [ -d "$file" ]
then
        echo "$file is a directory"
elif [ -f "$file" ]
then
        echo "$file is a file"
fi
done

image
C 語言的 for 命令

for (( i=1; i <= 10; i++ ))
do
        echo "The next number is $i"
done

image
使用多個變量

for (( a=1, b=10; a <= 10; a++, b-- ))
do
echo "$a - $b"
done

image
while 命令


最後更新:2017-10-08 12:33:16

  上一篇:go  【文檔】Mysql BinLog概述
  下一篇:go  驚!C++竟然還能有這種操作——高性能深度學習庫(DLL)