IFS 內部字段分隔符

IFS全拼爲:Internal Field Separator. 它有三個需要記住的特點:

  • IFS 是一個特殊的Shell變量
  • 如果需要,你可以改變IFS的值,跟普通的變量賦值一樣。e.g. IFS='|'
  • IFS的默認值是<space><tab><newline>, 即空格,製表符,空行

在我們平常使用中,有兩個很重要的地方會用到IFS,可能大家並沒有察覺。

  1. 在read命令中的使用
    --- read直接讀的時候。read會把所有的分隔符換成空格。
    >IFS=:; read a
    lei:yu
    >echo $a
    lei yu
    --- read讀取文件的時候。readf在讀文件的每一行的時候都會用IFS把這一行分隔開,然後賦值給變量。注意如果需要賦值的變量個數少於分隔後的結果,則多餘的不分隔。例如,“he|is|a|good|boy", 如果只有a,b,c三個變量(IFS=‘|’)則a="he", b="is", c="a|good|boy". 
    下面是一個例子,創建一個文件名字爲test.tmp,並寫入以下信息。
    >echo "leiyu|20|female" > test.tmp
    >echo "xyz|19|male" >> test.tmp
    寫一個名爲show_info.sh的腳本文件,內容如下:
    #!/bin/bash
    
    while IFS='|'  read -r name age gender
    do
        echo "$name is $age old. His(Her) gender is $gender"
    done < ./test.tmp
    chmod +x ./show_info.sh後直接運行,結果如下:
    >chmod +x ./show_info.sh
    >./show_info.sh
    leiyu is 20 old. His(Her) gender is female
    xyz is 19 old. His(Her) gender is male
  2. 在參數傳遞中的使用
    在運行shell文件的時候,有時候需要傳入參數,其實傳入的參數也跟這個IFS有關。下面的例子很好的說明了這個過程。
    創建./f.sh,下面是文件內容
    #!/bin/bash
    
    IFS='|'
    echo "$*" # 一個用IFS拼起來的字符串
    echo "$@" # 一個數組
    
    ================================
    >chmod +x ./f.sh
    >f.sh a b c d
    a|b|c|d
    a b c d

     

另外IFS還可以用在變量賦值的時候,如下設IFS爲c,則字符串中的c就會視作分隔符,"goodcmorning"被分隔成了good和morning,然後再組合起來賦值給var變量。

>IFS='c';var=goodcmorning;echo $var
good morning

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章