1、如果我沒保存原IFS,怎麼用語句直接設置IFS
IFS=" /n/t"
這樣設對嗎,是恢復默認的嗎??
答案:
1) 你可先將 IFS 存起來: old_IFS="$IFS"
要取回時再設 IFS="$old_IFS"
(記的雙引號一定要設哦)
2、我看說明中有:
IFS=
IFS=;
是一樣的意思,我不明白既然一樣爲什麼要用第二種形式呢??有什麼特殊意義嗎??還是僅用來區別與IFS=";"的不同。
第二種形式中的分號怎麼解釋??
答案:
若有兩個 command 打在同一行就用到
3、默認IFS時如果
A=" aaa"
echo $A
結果當然是
aaa
前面沒有空格
但是
A=";;;;aaa"
IFS=";"
echo $A 時
結果卻是
aaa
前面有四個空格,按道理不是應該沒有空格嗎?這是怎麼回事呢??
答案:
這是由於作爲 IFS 的空白字符 ( blank, tab, newline) 與其他 IFS 字符行爲不同:
1. IFS 空白在輸入的開始和結束處忽略。
2. 輸入中每個非 IFS 空白的 IFS 字符,以及任何相鄰的 IFS 空白,定界一個字段。
3. 非零長度 IFS 空格對字段進行定界。
如:
A="a 2 3 4" #a與2間有5個空格,2與3間有4個空格,3與4間有2個空格
echo $A
結果:
a 2 3 4
不管空格多少,都只輸出一個空格
4、文件b的內容是
echo $*
echo $1
#IFS=";"
#./b 111 22222
結果和不設IFS是一樣的,都是
111 2222 (--中間一個空格)
111
爲什麼在執行命令時IFS不起作用呢??
答案:
1. IFS 只對參數擴展有作用, $* 是 $1 - $n, 不包括 $0
2. IFS 對參數位置無作用. 參數位置由空白字符及有無" " 決定
在 "$*" 擴展時行爲不同 (如較新版本的 bash, ksh). 這是 POSIX 標準.
但由於歷史原因, 有些版本的 shell 並不按 man page 中所聲明的那樣擴展,
而是隻用空格, 這樣有無 IFS 對 "$*" 無影響
http://bbs.chinaunix.net/thread-512925-1-1.html
chinaunix-------
在 CR 之前, command line 已被重組為:
A="bbb" echo aaa
不妨來比較一下:
- [netman@www tmp]$ A=aaa
- [netman@www tmp]$ A="bbb" echo $A #相當於A="bbb" echo aaa
- aaa
- [netman@www tmp]$ A=aaa
- [netman@www tmp]$ A="bbb"; echo $A #但是此處和前處不一樣,因爲這種形式的已經在shell中改變了A的值,變爲了bbb
- bbb
- [netman@www tmp]$ A=aaa
- [netman@www tmp]$ A="bbb" eval echo /$A
- bbb