理解bash回声

时间:2014-01-02 23:43:09

标签: macos bash echo

我不理解bash的echo命令。你能解释为什么echo $a只输出以下的换行符吗?

MacbookAir1:so1 palfvin$ a='[]'
MacbookAir1:so1 palfvin$ echo $a

MacbookAir1:so1 palfvin$ echo "$a"
[]
MacbookAir1:so1 palfvin$ echo '[]'
[]
MacbookAir1:so1 palfvin$ 

我特别感谢参考一些文件来解释这一点。

bash版本为GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)

更新:重置每个评论帖后输出的IFS检查如下:

MacbookAir1:~ palfvin$ echo "$IFS" | od -c
0000000       \t  \n  \n                                                
0000004
MacbookAir1:~ palfvin$ echo "$IFS" | od -h
0000000      0920    0a0a                                                
0000004

2 个答案:

答案 0 :(得分:4)

设置nullglob shell选项可能会导致此问题。 []是一个与[]之间的任何字符匹配的glob模式,也就是说。通常情况下,如果shell发现的模式与任何东西都不匹配,那么它只会让它独自存在;但是nullglob将其删除:

$ a='[]'
$ echo $a
[]
$ shopt -s nullglob
$ echo $a

$ 

来自Filename Expansion section of the bash manual

  

分词后,除非设置了-f选项(参见Set   内置),Bash扫描每个单词的字符'*','?'和'['。   如果出现其中一个字符,则该单词被视为a   模式,并替换为按字母顺序排序的文件名列表   匹配模式。如果找不到匹配的文件名,那么   shell选项nullglob被禁用,单词保持不变。如果   设置了nullglob选项,找不到匹配项,删除该单词。

答案 1 :(得分:1)

你的$IFS设置为什么?

当我将其设置为IFS='[]'时,我可以重现您的结果(在MacBook Pro上运行Mavericks 10.9.1并使用Bash 3.2.51(1))。当IFS设置为空格时,问题不会重现:

$ echo []
[]
$ x=[]
$ echo $x
[]
$ IFS='[]'
$ echo $x

$

顺便说一下,bash -v调用详细模式;它在处理shell脚本时回应它。你可能仍然处于一个子shell中,除非你发现自己处于一个长期被遗忘的父shell而不是一个关闭的窗口,否则在你尝试退出它之前这应该没什么关系。

相关问题