如何在单引号字符串中使用变量?

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

【讨论】:

如果您的变量包含文字单引号则不起作用,因此这对于未知值是不可靠的。

以上是关于如何在单引号字符串中使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在单引号字符串中转义单引号

如何在单引号 php 中使用单引号?

如何在单引号内使用单引号?

尝试在单引号 Bash 中使用变量

如何在curl PUT请求的主体中使用环境变量?

关于引号的总结