根据http://tldp.org/LDP/abs/html/quotingvar.html
使用双引号来防止分词。 用双引号括起来的参数表示为一个单词, 即使它包含空格分隔符。
但是,我有
0> /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
[...]
1> cat inspect.sh
#!/bin/bash
echo "first argument is $1"
echo "second argument is $2"
2> cat test.sh
#!/bin/bash
set -x
./inspect.sh "hello $@"
3> ./test.sh alice bob
+ ./inspect.sh 'hello alice' bob
first argument is hello alice
second argument is bob
4> ./test.sh "alice bob"
+ ./inspect.sh 'hello alice bob'
first argument is hello alice bob
second argument is
我想知道为什么3>和4>有不同的结果?如何修改test.sh让3>具有与4>相同的输出?
答案 0 :(得分:8)
答案是$@
很特别。
来自Bash Reference Manual部分3.4.2 Special Parameters
:
@
从一个开始扩展到位置参数。当扩展发生在双引号内时,每个 参数扩展为a 单词。也就是说," $ @"相当于" $ 1" " $ 2#34; ...。如果 双语扩张发生在一个词内,扩展了 第一个参数与原始的开头部分连接在一起 单词,并将最后一个参数的扩展与最后一个参数连接起来 原始单词的一部分。没有位置参数时 " $ @"并且$ @扩展为空(即,它们被删除)。
具体做法是:
和
哪个组合使你"hello "
合并到第一个参数,""
合并到最后一个参数,但每个参数都扩展为它自己的单词。
如果要将所有参数展开为一个单词,则需要使用$*
。
*
从一个开始扩展到位置参数。当扩展发生在双引号内时,它 扩展为一个单词 每个参数的值由第一个字符分隔 IFS特殊变量。也就是说," $ *"相当于" $ 1c $ 2c ...", 其中c是IFS变量值的第一个字符。如果 IFS未设置,参数由空格分隔。如果IFS为null, 参数连接时没有插入分隔符。