我不理解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
答案 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而不是一个关闭的窗口,否则在你尝试退出它之前这应该没什么关系。