2017年12月26日 星期二

『Bash Shell』如何印出 IFS 變數的內容值與 word splitting 程式範例/完整說明

變數 IFS(Internal Field Separator)是 bash 在做 word splitting 時做為分隔符(delimiter)用,其預設值(default value)是 space, tab 與 newline,這三個字元每一個都可做為分隔符(delimiter)用。word splitting 是 bash 做完 expansions(parameter expansion, command substitution, arithmetic expansion)後,針對非 double quote 且有發生 expansions 的部分,進一步以變數 IFS 來做 word splitting。

範例:

#!/bin/sh

showParams()
{
        echo \$# = $#
        while [ "$1" ]
        do
                echo $1
                shift
        done

}

IFS=/
var1="1 2 3"
var2="a b c"
var3="d/e/f"

showParams "$var1" $var2 $var3

結果:

$# = 5
1 2 3
a b c
d
e
f


說明:
1. 將 IFS 設定為 '/'
2. "$var1" 因為被 double quote,所以 1 2 3 被當做一整個參數。
3. $var2 的內容值是 a b c,因為沒有包含 IFS 的 '/',所以也被當做一整個參數。
4. $var3 的內容值是 d/e/f,包含 IFS 的 '/',所以被 word splitting 成三個參數。

變數 IFS(Internal Field Separator)的預設值是 space, tab, newline,直接印也看不出所以然,但是可以透過 od 的幫助來顯示其內容值。

範例:

#!/bin/sh

echo -n "$IFS" | od -a -t x1 -c

結果:


0000000  sp  ht  nl
         20  09  0a
             \t  \n
0000003

說明:
1. -n 是為了讓 echo 不要丟出 newline。
2. "$IFS" 加上 double quote 才能讓 echo 得到 $IFS 的內容值。

如果修改過變數 IFS(Internal Field Separator)的值後,想將其設定回預設值,可以使用以下方式。

範例:

#!/bin/sh

IFS=$' \t\n'
echo -n "$IFS" | od -a -t x1 -c

結果:

0000000  sp  ht  nl
         20  09  0a
             \t  \n
0000003

沒有留言:

張貼留言