即使使用双引号也会发生单词分裂

时间:2015-01-06 23:00:00

标签: bash

根据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>相同的输出?

1 个答案:

答案 0 :(得分:8)

答案是$@很特别。

来自Bash Reference Manual部分3.4.2 Special Parameters

  

@

     

从一个开始扩展到位置参数。当扩展发生在双引号内时,每个   参数扩展为a   单词。也就是说," $ @"相当于" $ 1" " $ 2#34; ...。如果   双语扩张发生在一个词内,扩展了   第一个参数与原始的开头部分连接在一起   单词,并将最后一个参数的扩展与最后一个参数连接起来   原始单词的一部分。没有位置参数时   " $ @"并且$ @扩展为空(即,它们被删除)。

具体做法是:

  • 当扩展发生在双引号内时,每个参数都会扩展为单独的单词。

  • 如果在单词中出现双引号扩展,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后一部分连接。 / LI>

哪个组合使你"hello "合并到第一个参数,""合并到最后一个参数,但每个参数都扩展为它自己的单词。

如果要将所有参数展开为一个单词,则需要使用$*

  

*

     

从一个开始扩展到位置参数。当扩展发生在双引号内时,它   扩展为一个单词   每个参数的值由第一个字符分隔   IFS特殊变量。也就是说," $ *"相当于" $ 1c $ 2c ...",   其中c是IFS变量值的第一个字符。如果   IFS未设置,参数由空格分隔。如果IFS为null,   参数连接时没有插入分隔符。