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

45

如何在单引号内输出变量?

echo 'test text "here_is_some_test_text_$counter" "output"' >> ${FILE}

请参见 https://dev59.com/NWkw5IYBdhLWcg3wMHum。 - tripleee
相关:https://dev59.com/nF3Ua4cB1Zd3GeqP9RvJ - Jesse Nickles
8个回答

78

在双引号字符串中,变量会被展开,但在单引号字符串中不会:

 $ 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"

2
或者,echo "测试文本 \"这里是一些测试文本_$counter\" \"输出\""... 转义你不想让 shell 解释的双引号。 - twalberg
5
不要忘记引用 "$FILE" - Aleks-Daniel Jakimenko-A.
@Aleks-DanielJakimenko-A. 这是必要的吗? - user7851115
1
@JoshDetwiler 长话短说:是的。你链接的回答很好,详细说明了所有细节,但引用变量从来不会有害,而且大多数情况下确实需要引号以获得正确的行为。 - Aleks-Daniel Jakimenko-A.
如果你只是简单地切换引号,那是不可能的,如果你正在使用用引号包围的JSON(JSON需要双引号来表示其值)。 - DarkTrick

7

使用printf函数:

printf 'test text "here_is_some_test_text_%s" "output"\n' "$counter" >> ${FILE}

8
请引用"$FILE"。 - Aleks-Daniel Jakimenko-A.

4

使用heredoc:

cat << EOF >> ${FILE}
test text "here_is_some_test_text_$counter" "output"
EOF

3

最易读、最实用的方式是在双引号内使用花括号。

'test text "here_is_some_test_text_'"${counter}"'" "output"' >> "${FILE}"

1
Ignacio Vazquez-Abrams的答案已经有10个月了,这是一个重复的内容。 - Jonas Berlin
1
@JonasBerlin:并不完全是重复,但是,考虑到所谓的改进是为了使原始解决方案起作用而偶然发生的,因此这应该是一个“评论”,而不是一个答案。 - mklement0
2
很遗憾,我没有足够的声望来留下评论。 - Paul Back

1

在变量周围添加另一对单引号解决了我的问题。

对于您的情况:

echo '测试文本 "这里是一些测试文本_'$counter'" "输出"' >> ${FILE}


0

输出一个被单引号包裹的变量:

printf "'"'Hello %s'"'" world

如果您的变量包含单引号,那么这种方法就无法正常工作,因此在处理未知值时不太可靠。 - Charles Duffy

0
你可以这样做:
$ 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

-1
用子shell:
var='hello' echo 'blah_'`echo $var`' blah blah';

2
不起作用,回显blah_`echo $var` blah blah - Jonas Berlin
你说得对,需要用双引号而不是单引号括起来。我已经修正了答案。 - R.Sicart
你的新答案将压缩$var中的任何空白字符,请参见Ignacio Vazquez-Abrams的答案。 - Jonas Berlin
1
这是一个无用的echo使用。你可以使用'blah_'"$var"' blah blah.',但这已经在Ignacio的答案中了。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接