Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988435
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

2008-07-24 01:33:03

Bash中word splitting使用到的IFS的使用

部分内容转自:

还有一个好帖子:

1) shell command line 主要是要將整行 line 給 break down 每一個詞(word)。
2) 而詞與詞之區隔符號就是 IFS 。
3) shell 會對 command line 作處理(如提換、quoting、等),完成後再按詞重組。注:別忘了這個"重組"特性。
4) 當你用 IFS 來開頭讀進一個變量值,那,shell 會先整理出這個詞,然後再"重組" command line 。
5) 然而,你將 IFS 換成其他,那 shell 將視你那些 space/tab 為"詞",而不是 IFS 。那在重組時,你可得到這些"詞"。

若你不能理解,那來個簡單實驗看看或可理解:

CODE:
$ A="   abc"
$ echo $A
abc
$ echo "$A" # note1
   abc
$ old_IFS=$IFS
$ IFS=;
$ echo $A
   abc
-bash-2.05b$ IFS=$old_IFS
$ echo $A
abc


noet1:這裡是用 soft quoting 將裡面的 space 關閉,使之不是 metat(IFS),而是一個 literal(white space)。

下面讲述IFS=;和IFS=";"的区别,即前者是将IFS置为null后者是将IFS置为;字符

只是,後面的問題(含前面),是出在 IFS=; 上。
因為這個 ; 在當前的 command line 上是一個 meta ,並非" ; "符號本身。
因此 IFS=; 是將 IFS 設為 null charactor (不是 space, tab, newline)。

要不要試試:

CODE:
old_IFS=$IFS
$read A
;a;b;c
$ IFS=
$ echo $A
;a;b;c
$ IFS=";"  #note2
$ echo $A
a b c


note2: 要關閉 ; 可用 ";" 或 ';' 或 \; 。


阅读(1638) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~