關於環境變量IFS


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM