Answers:
单引号不会插值,但双引号会插值。例如:变量,反引号,某些\转义符等。
例:
$ echo "$(echo "upg")"
upg
$ echo '$(echo "upg")'
$(echo "upg")Bash手册说:
将字符括在单引号(
')中可保留引号内每个字符的字面值。即使在单引号前加反斜杠,也不能在单引号之间引起单引号。在双引号包围字符(
")保留了引号中的所有字符的字面意义,例外$,`,\,和,启用了历史扩展的时候,!。字符$和`双引号中保留其特殊含义(请参见Shell Expansions)。反斜杠后跟当由下列字符只保留它的特殊含义:$,`,",\或换行符。在双引号中,将删除反斜杠,后跟这些字符之一。没有特殊含义的反斜杠前面的字符将保持不变。双引号可以在双引号内加上反斜杠。如果启用,将执行历史记录扩展,除非!使用反斜杠将双引号引起来。之前的反斜杠!未删除。特殊参数
*和@在双引号中具有特殊含义(请参见Shell参数扩展)。
PS1。尝试echo $PS1明白我的意思。但是PS1会在显示之前进行评估(请参见PROMPTINGbash手册页中的部分)。要对此进行测试,请尝试PS1='$X'。您将没有提示。然后运行X=foo,突然您的提示是“ foo”(设置而不是显示PS1时已经评估过,您仍然没有提示)。
                    该接受的答案是伟大的。我正在制作一张有助于快速理解该主题的表格。解释涉及一个简单的变量a以及一个索引数组arr。
如果我们设置
a=apple      # a simple variable
arr=(apple)  # an indexed array with a single element然后echo第二列中的表达式,我们将获得第三列中显示的结果/行为。第四列说明了行为。
 # | Expression  | Result      | Comments
---+-------------+-------------+--------------------------------------------------------------------
 1 | "$a"        | apple       | variables are expanded inside ""
 2 | '$a'        | $a          | variables are not expanded inside ''
 3 | "'$a'"      | 'apple'     | '' has no special meaning inside ""
 4 | '"$a"'      | "$a"        | "" is treated literally inside ''
 5 | '\''        | **invalid** | can not escape a ' within ''; use "'" or $'\'' (ANSI-C quoting)
 6 | "red$arocks"| red         | $arocks does not expand $a; use ${a}rocks to preserve $a
 7 | "redapple$" | redapple$   | $ followed by no variable name evaluates to $
 8 | '\"'        | \"          | \ has no special meaning inside ''
 9 | "\'"        | \'          | \' is interpreted inside "" but has no significance for '
10 | "\""        | "           | \" is interpreted inside ""
11 | "*"         | *           | glob does not work inside "" or ''
12 | "\t\n"      | \t\n        | \t and \n have no special meaning inside "" or ''; use ANSI-C quoting
13 | "`echo hi`" | hi          | `` and $() are evaluated inside ""
14 | '`echo hi`' | `echo hi`   | `` and $() are not evaluated inside ''
15 | '${arr[0]}' | ${arr[0]}   | array access not possible inside ''
16 | "${arr[0]}" | apple       | array access works inside ""
17 | $'$a\''     | $a'         | single quotes can be escaped inside ANSI-C quoting
18 | "$'\t'"     | $'\t'       | ANSI-C quoting is not interpreted inside ""
19 | '!cmd'      | !cmd        | history expansion character '!' is ignored inside ''
20 | "!cmd"      | cmd args    | expands to the most recent command matching "cmd"
21 | $'!cmd'     | !cmd        | history expansion character '!' is ignored inside ANSI-C quotes
---+-------------+-------------+--------------------------------------------------------------------也可以看看:
The special parameters * and @ have special meaning when in double quotes什么,"*"结果如何*?
                    "$@"和"$*"是参数扩展。"@"而且"*"不是。
                    echo "\'",还给我\'。
                    其他人解释得很好,只想举一些简单的例子。
可以在文本周围使用单引号,以防止外壳解释任何特殊字符。当用单引号引起来时,美元符号,空格,&符,星号和其他特殊字符都将被忽略。
$ echo 'All sorts of things are ignored in single quotes, like $ & * ; |.' 它将给出:
All sorts of things are ignored in single quotes, like $ & * ; |.唯一不能放在单引号中的是单引号。
双引号的行为与单引号类似,不同之处在于双引号仍然允许Shell解释美元符号,反引号和反斜杠。众所周知,反斜杠会阻止单个特殊字符的解释。如果需要将美元符号用作文本而不是变量,则在双引号内很有用。它还允许转义双引号,因此不会将其解释为带引号的字符串的结尾。
$ echo "Here's how we can use single ' and double \" quotes within double quotes"它将给出:
Here's how we can use single ' and double " quotes within double quotes还可能注意到,双引号中忽略了撇号(否则将被解释为带引号的字符串的开头)。但是,变量将被解释并用双引号内的值替换。
$ echo "The current Oracle SID is $ORACLE_SID"它将给出:
The current Oracle SID is test反引号完全不同于单引号或双引号。反引号不是用来防止特殊字符的解释,而是实际上强制执行它们所包含的命令。执行封闭的命令后,它们的输出将替换原始行中的反引号。用一个例子将更清楚。
$ today=`date '+%A, %B %d, %Y'`
$ echo $today 它将给出:
Monday, September 28, 2015 ' '和的用法之间有明显区别" "。
当' '在任何事物上使用时,都不会完成“转换或翻译”。它按原样打印。
使用" ",无论其周围如何,都会被“转化或转化”为其价值。
通过翻译/转换,我的意思是:单引号内的所有内容都不会“翻译”为其值。它们将被引用为引号。示例:a=23,然后echo '$a'将$a在标准输出上产生。而echo "$a"将按23标准产量生产。
由于这是处理引号中的事实答案 bash,因此在处理shell中的算术运算符时,我将补充上面答案中遗漏的一点。
该bash外壳支持两种方式做算术运算,一个定义的内置let命令和$((..))操作。前者评估算术表达式,而后者则更多是复合语句。
重要的是要理解,与let其他外壳程序命令一样,用于的算术表达式也会进行单词拆分和路径名扩展。因此,需要进行正确的引用和转义。
使用时请参见以下示例 let
let 'foo = 2 + 1'
echo $foo
3在这里使用单引号绝对没问题,因为这里不需要变量扩展,请考虑以下情况
bar=1
let 'foo = $bar + 1'会惨遭失败,因为$bar单引号下的内容不会扩展,因此需要将双引号
let 'foo = '"$bar"' + 1'这应该是原因之一,$((..))应该始终考虑使用let。因为在其中,内容无需分词。前面的示例let可以简单地写成
(( bar=1, foo = bar + 1 ))$((..))不带单引号的尽管$((..))可以与双引号一起使用,但由于它不能包含需要双引号的内容,因此没有任何目的。只要确保它不是单引号即可。
printf '%d\n' '$((1+1))'
-bash: printf: $((1+1)): invalid number
printf '%d\n' $((1+1))
2
printf '%d\n' "$((1+1))"
2在某些特殊情况下,可能需要在$((..))单引号引起来的字符串中使用运算符,您需要对引号进行插值,以使运算符不加引号或用双引号引起来。例如,考虑一种情况,当您打算在curl每次请求时使用语句内的运算符来传递计数器时,请执行
curl http://myurl.com --data-binary '{"requestCounter":'"$((reqcnt++))"'}'请注意,在内部使用了嵌套的双引号,否则,原义字符串$((reqcnt++))将传递给requestCounterfield。
$[[...]]语法,但是也许您忘了它是对的。