|

楼主 |
发表于 2007-5-3 17:49:16
|
显示全部楼层
Post by yongjian
Its actually controlled through IFS. the internal field separator. try this:
IFS=""; echo $(ls); echo "$(ls)". They become the same. stuff in "" will take literally but if there is no "", then shell takes the default separater which is set in IFS.
但是你这句话并没有解释为什么没有改IFS时有与没有引号("")结果会不同啊.
以我的理解,shell本身不会用IFS去分割引号里的内容.还有如果用IFS=""把IFS设为空,shell是根本不去分割,而不是逐字地(literally)分割,所以有没有引号("")结果会一样.看以下命令:
$t="a b c"
$for i in $t ; do echo "["$i"]" ; done
[a]
[c]
$for i in "$t" ; do echo "["$i"]";done
[a b c]
$IFS=""; for i in $t ; do echo "["$i"]" ;done
[a b c]
另外,在debian手册中给了一个例子:
...........
shell 也使用 IFS 来分开参数扩展、命令替换和算术扩展的结果集。但在被单引号或双引号引用的单词内,不会发生这种情况。 默认的 IFS 值是: <space>、 <tab> 和 <newline> 。
请小心使用这个 shell IFS 技巧。 当 shell 解释部分脚本作为它的输入时(此句不懂),奇怪的事情将会发生。
$ IFS=":," # 使用 ":" 和 "," 作为 IFS
$ echo IFS=$IFS, IFS="$IFS" # echo 是 Bash 内建的
IFS= , IFS=:, #,前有2个空格
中间那个","是怎么回事? 再看下面4个命令:
$echo IFS=$IFS: , IFS="$IFS"
IFS= , IFS=:, #,前有3个空格
$echo IFS=$IFS : , IFS="$IFS" #中间的":,"与前面的$IFS有空格
IFS= : , IFS=:, #:前有2个空格
$echo IFS=$IFS, : IFS="$IFS"
IFS= , : IFS=:, #,前有2空格
$echo IFS=$IFS , : IFS="$IFS"
IFS= , : IFS=:, #,前有2空格,跟上面一样
从这4个命令可以看出,中间的","无论是否与前面的IFS=$IFS相邻都没当作splitter,而":"则不同,与IFS=$IFS相邻时被解释成splitter,而不相邻时则没有.是否IFS=":,"这句有先后顺序?改为IFS=",:"再运行同样命令结果还是一样,真让人摸不着规律. |
|