shell中的IFS詳解

在bash中IFS是內部的域分隔符,manual中對其的敘述如下:
IFS The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is.
如下是一些值得注意的地方。
1. IFS的默認值爲:空白(包括:空格,tab, 和新行),將其ASSII碼用十六進制打印出來就是:20 09 0a (見下面的shell腳本)。
2. IFS對空格的空白的處理和其他字符不一樣,左右兩邊的純空白會被忽略,多個連續的空白被當成一個IFS處理。
3. S*中使用IFS中的第一個字符。
4. awk中的FS(域分隔符)也和IFS有類似的用法和作用。

我寫了一個shell腳本來演示IFS的用法和作用,如下:
#! /bin/bash
#author: Jay Ren
#date: 2011.12.10
 
echo "----------------------------------IFS test--------------------------------"
echo "default \$IFS is:(ASSII in hexadecimal value)"
echo -n "$IFS" | xxd -g 1 | awk -F":" '{print $2}' | awk -F" " '{print $1, $2, $3}'
echo "by default, IFS should be a SPACE, a HORIZONTAL TAB, or a LINC FEED."
 
function output_args_one_per_line()
{
arg_list=$*
echo "\$*='$*'"
for arg in $arg_list
do
echo "[$arg]"
done
}
 
echo "--------------------------------------------------------------------------"
echo "set IFS=' ' #dealing with SPACE in IFS is different with other chars."
echo "var=' a b c '"
IFS=' '
var=" a b c "
output_args_one_per_line $var
 
echo "--------------------------------------------------------------------------"
echo "set IFS=':'"
echo "var='::a:b::c:::'"
IFS=':'
var="::a:b::c:::"
output_args_one_per_line $var
 
echo "--------------------------------------------------------------------------"
echo "set IFS='+:-;' #but \$* just use 1st char in IFS as the separator."
echo "var='::a:b::c:::'"
IFS='+:-;'
var="::a:b::c:::"
output_args_one_per_line $var
 
echo "--------------------------------------------------------------------------"
echo "set IFS='-+:;' #but \$* just use 1st char in IFS as the separator."
echo "var='::a:b::c:::'"
IFS='-+:;'
var="::a:b::c:::"
output_args_one_per_line $var
 
echo "--------------------------The END of IFS test-----------------------------"

運行這個腳本結果如下:
master@jay-linux:~/workspace/mygit/shell/sh2011$ ./IFS-test.sh
----------------------------------IFS test--------------------------------
default $IFS is:(ASSII in hexadecimal value)
20 09 0a
by default, IFS should be a SPACE, a HORIZONTAL TAB, or a LINC FEED.
--------------------------------------------------------------------------
set IFS=' '   #dealing with SPACE in IFS is different with other chars.
var='  a b  c   '
$*='a b c'
[a]
[b]
[c]
--------------------------------------------------------------------------
set IFS=':'
var='::a:b::c:::'
$*='::a:b::c::'
[]
[]
[a]
[b]
[]
[c]
[]
--------------------------------------------------------------------------
set IFS='+:-;'   #but $* just use 1st char in IFS as the separator.
var='::a:b::c:::'
$*='++a+b++c++'
[]
[]
[a]
[b]
[]
[c]
[]
--------------------------------------------------------------------------
set IFS='-+:;'   #but $* just use 1st char in IFS as the separator.
var='::a:b::c:::'
$*='--a-b--c--'
[]
[]
[a]
[b]
[]
[c]
[]
--------------------------The END of IFS test-----------------------------

發佈了297 篇原創文章 · 獲贊 36 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章