1、定義
環境變量IFS,稱為內部字段分隔符(internal field separator),定義了bash shell用作字段分隔符的一系列字符。默認情況下,bash shell會將下列字符當做字段分隔符:
- 空格
- 制表符
- 換行符
2、IFS相關的問題
如果bash shell在數據中看到了這些字符中的任何一個,它就會假定這表明了列表中一個新數據字段的開始。在處理含有空格的數據時,就會非常麻煩。
假設有一文件status.txt,其內容如下:
Alaska Arizona Arkansas Colorado Connecticut Delaware Florida Georgia New York New Hampshire North Carolina
在文件最后三行的數據中含有空格,使用for循環讀取每一行時,由於空格為默認的字段分割符,bash shell遇到空格,就認為讀取到一個新的字段,進而出現以下問題。
shell腳本如下:
1 #!/bin/bash 2 # 讀取文件中的每一行 3 4 file="status.txt" 5 for line in $(cat ${file}) 6 do 7 echo "Visit beautiful $line" 8 done
運行結果如下:
可以看到,for循環將每個以空格隔開的單詞作為單獨的值,而不是將每一行作為一個單獨的值。要解決這個問題,可以在shell腳本中臨時改變環境變量IFS的值來限制被bash shell當做字段分隔符的字符,修改腳本如下:
1 #!/bin/bash 2 # 讀取文件中的每一行 3 4 file="status.txt" 5 IFS=$'\n' 6 for line in $(cat ${file}) 7 do 8 echo "Visit beautiful $line" 9 done
再次運行腳本,結果如下:
在處理代碼量較大的腳本時,可能在一個地方需要修改IFS的值,然后忽略這次修改,在腳本的其他地方繼續使用IFS的默認值。一個可參考的安全實踐是在改變IFS之前保存原來的IFS值,之后再恢復它,如下所示:
1 IFS.OLD=$IFS 2 IFS=$’\n’ 3 #在接下來的代碼中使用新的IFS 4 #codes 5 #使用完畢后恢復IFS原來的值 6 IFS=$IFS.OLD