2016-02-14 83 views
2

我正在学习Bash脚本的基础知识。如果我没有弄错,那么没有分隔符的字符串和用双引号(")分隔的字符串几乎是以相同的方式解释的,所以就像字母数字字符串一样;内部的变量被扩展。另一方面,用单引号(')分隔的字符串不会扩展变量,这是将它们与前面提到的变量进行比较的主要区别。 在终端上练习一下,我注意到一条语句不能按我的预期工作。正如你可以看到在这个例子:为什么不回声“Hello World!”声明按预期工作?

MacBook-Pro-di-Rodolfo:~ Rodolfo$ echo Hello World! 
Hello World! 
MacBook-Pro-di-Rodolfo:~ Rodolfo$ echo 'Hello World!' 
Hello World! 
MacBook-Pro-di-Rodolfo:~ Rodolfo$ echo "Hello World!" 
echo "Hello World" 
Hello World 

最后的语句不打印出相同的字符串作为以前的,截断的感叹号。任何人都可以向我解释这个角色移除的原因吗? 如果它可以有用,我在Mac OS X v。10.9下运行所有​​这些。

+2

见http://unix.stackexchange.com/q/33339/23529 –

+0

@DanielJour,所以最优雅的解决方案,以避免这种情况是只使用单引号,考虑到反斜杠字符DOEN”在这种情况下工作? – rudicangiotti

+1

在这里使用转义反斜杠有什么问题? IIRC相邻的字符串由bash连接起来,所以像'“Hello World”'!''也应该起作用。 –

回答

3

这是一个真正的评论:

报价,unquotes串在一个非常基本的方式不同:未加引号的字符串是受外壳进一步扩大

词的拆分:未加引号的字符串将被标记化壳,和令牌被接合为单个空格

text="my name is 
    Inigo Montoya" 
echo "$text" 
echo $text 

输出

my name is 
    Inigo Montoya 
my name is Inigo Montoya 

注意空格如何被倒塌的不带引号的版本

文件名生成:外壳名样式(又名“水珠”模式)将在不带引号的字符串进行扩展:

text="files *" 
echo "$text" 
echo $text 

输出

files * 
files [list of all files in your current directory ...] 

此行为可以用set -f和来控制


对于所有的血淋淋的细节,请阅读bash的手册:

而这种规范的文章:

+0

只是为了好玩:'(IFS =''; echo $ text)'。 –

+0

你的意思是'(IFS =''; set -f; echo $ text)''echo'$ text“'。 Whee,好玩! –

+1

那么,我真的没有'set -f'的意思,但只是为了说明保留了换行符和连续空格。 (当然,所有这些都是一个坏主意,只能在家长的监督下使用 - 除非我们杀死了你的父亲,我们应该准备去死)。 –