IFS

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
不妨來比較一下:

  1. [netman@www tmp]$ A=aaa
  2. [netman@www tmp]$ A="bbb" echo $A   #相當於A="bbb" echo aaa
  3. aaa
  4. [netman@www tmp]$ A=aaa
  5. [netman@www tmp]$ A="bbb"; echo $A #但是此處和前處不一樣,因爲這種形式的已經在shell中改變了A的值,變爲了bbb
  6. bbb
  7. [netman@www tmp]$ A=aaa
  8. [netman@www tmp]$ A="bbb" eval echo /$A
  9. bbb

 

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