如何在单引号字符串中使用变量?
Posted
技术标签:
【中文标题】如何在单引号字符串中使用变量?【英文标题】:How do I use variables in single quoted strings? 【发布时间】:2014-02-07 04:02:30 【问题描述】:我只是想知道如何在单引号内回显一个变量(我使用单引号,因为字符串中有引号)。
echo 'test text "here_is_some_test_text_$counter" "output"' >> $FILE
任何帮助将不胜感激
【问题讨论】:
另见***.com/questions/10067266/… 参见Difference between single and double quotes in Bash。 【参考方案1】:变量在双引号字符串中展开,但不是在单引号字符串中:
$ name=World
$ echo "Hello $name"
Hello World
$ echo 'Hello $name'
Hello $name
如果您可以简单地切换引号,请这样做。
如果您更喜欢使用单引号来避免额外的转义,您可以在同一参数中混合和匹配引号:
$ echo 'single quoted. '"Double quoted. "'Single quoted again.'
single quoted. Double quoted. Single quoted again.
$ echo '"$name" has the value '"$name"
"$name" has the value World
适用于您的案例:
echo 'test text "here_is_some_test_text_'"$counter"'" "output"' >> "$FILE"
【讨论】:
或者,echo "test text \"here_is_some_test_text_$counter\" \"output\""
... 转义您不希望 shell 解释的双引号。
别忘了引用"$FILE"
。
@Aleks-DanielJakimenko-A。 Is it necessary?
@JoshDetwiler 长话短说:是的。您链接的答案很好,并且涉及所有细节,但是引用变量永远不会受到伤害,并且大多数情况下,引用确实是必需正确行为。【参考方案2】:
使用 printf:
printf 'test text "here_is_some_test_text_%s" "output"\n' "$counter" >> $FILE
【讨论】:
请引用"$FILE"
。【参考方案3】:
带有子外壳:
var='hello' echo 'blah_'`echo $var`' blah blah';
【讨论】:
不起作用,回显blah_`echo $var` blah blah
你说得对,需要用双引号而不是单引号括起来。我确定了答案。
您的新答案将压缩 $var
.. 中的任何空格。请参阅 Ignacio Vazquez-Abrams 的答案..
那是useless use of echo
。 'blah_'"$var"' blah blah.'
你会没事的,但这已经在 Ignacio 的回答中了。【参考方案4】:
使用heredoc:
cat << EOF >> $FILE
test text "here_is_some_test_text_$counter" "output"
EOF
【讨论】:
【参考方案5】:最易读、最实用的方式是在双引号内使用花括号。
'test text "here_is_some_test_text_'"$counter"'" "output"' >> "$FILE"
【讨论】:
Ignacio Vazquez-Abrams 10 个月前的回答重复 @JonasBerlin:不完全是重复的,但是,鉴于所谓的改进是偶然使原始解决方案发挥作用,这应该是一个评论,不是答案。 很遗憾,我没有发表评论的资格。【参考方案6】:你可以这样做:
$ counter=1 eval echo `echo 'test text \
"here_is_some_test_text_$counter" "output"' | \
sed -s 's/\"/\\\\"/g'` > file
cat file
test text "here_is_some_test_text_1" "output"
说明: eval 命令会将字符串作为命令处理,因此经过正确的转义量后,它将产生所需的结果。
它说执行以下字符串作为命令:
'echo test text \"here_is_some_test_text_$counter\" \"output\"'
在一行中再次命令:
counter=1 eval echo `echo 'test text "here_is_some_test_text_$counter" "output"' | sed -s 's/\"/\\\\"/g'` > file
【讨论】:
【参考方案7】:输出一个用单引号括起来的变量:
printf "'"'Hello %s'"'" world
【讨论】:
如果您的变量包含文字单引号则不起作用,因此这对于未知值是不可靠的。以上是关于如何在单引号字符串中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章