Shell中的 IFS

1、IFS 介紹shell

     Shell 腳本中有個變量叫 IFS(Internal Field Seprator) ,內部域分隔符。完整定義是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.bash

    當 shell 處理"命令替換"和"參數替換"時,shell 根據 IFS 的值,默認是 space, tab, newline 來拆解讀入的變量,而後對特殊字符進行處理,最後從新組合賦值給該變量。
ide

    對於IFS的使用,惟一的途徑,就是了解shell的執行順序。在《shell腳本學習指南》第7章,179頁,有個圖,說的很清晰明瞭。在命令行上,對單引號字符串、雙引號字符串、不帶引號字符串的引用如何處理都講的很清晰,以及IFS分隔字符串的時機。
整體上記住一點,雙引號和單引號字符串引用能夠屏蔽對命令參數使用IFS分割學習

wKiom1P19HziCeSLAAJeUKSJVl0900.jpg

    如上圖所示,shell命令被解析執行的順序。在第①步和第⑨步,都會進行一個 split 操做。在第①步中,咱們在命令行上輸入命令,而後shell首先會把它們以IFS做爲分隔符split爲token, 而後到了第⑨步中,參數擴展和命令替換後的結果也會被以IFS爲分隔符,split爲word。ui

    如下是值得注意的地方:
spa

  1. IFS is the space, tab, and newline characters by default,連續多個空白被看作一個處理命令行

  2. "$*" 使用IFS中的第一個字符做爲分隔符,把參數鏈接orm

  3. awk中的FS(域分隔符)也和IFS有相似的用法和做用blog


2、IFS 簡單實例token

一、查看IFS的值

[root@localhost ~]# set | grep IFS
IFS=$' \t\n'
[root@localhost ~]# echo -n "$IFS" | od -ab
0000000  sp  ht  nl
        040 011 012
0000003

二、"$@" 和 "$*" 異同

*      Expands to the positional parameters, starting from one.  When the expansion occurs within  double quotes,  it expands to a single word with the value of each parameter separated by the first character of the IFS special variable.  That is, "$*" is equivalent to "$1c$2c...",  where  c  is  the first  character  of the value of the IFS variable.  If IFS is unset, the parameters are separated by spaces.  If IFS is null, the parameters are joined without intervening separators.

@      Expands to the positional parameters, starting from one.  When the expansion occurs within  double quotes,  each  parameter expands to a separate word.  That is, "$@" is equivalent to "$1" "$2" ... If the double-quoted expansion occurs within a word, the  expansion  of  the  first  parameter  is joined  with  the  beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word.  When there are no positional parameters, "$@" and $@ expand to nothing (i.e., they are removed).

"$@"  "$*"     只有當用雙引號quoting時, 它們纔有所不一樣。

$@     $*       兩種結果是相同的。
相關文章
相關標籤/搜索