在此处字符串中使用变量

snu*_*den 1 shell scripting bash here-string

为了向交互式脚本提供输入,我一直在使用此处的字符串:

script <<< $'1 2\n3 4\n5 6\nq'
Run Code Online (Sandbox Code Playgroud)

这有效地进入

1 2
3 4
5 6
q
Run Code Online (Sandbox Code Playgroud)

进入脚本。但是如何用变量替换其中之一?

script <<< $'$var 2\n3 4\n...'
Run Code Online (Sandbox Code Playgroud)

不起作用...

Mic*_*mer 7

那不是 here 字符串,而是ANSI-C 引用

$'string' 形式的词被特殊处理。... 扩展结果是单引号的,就好像美元符号不存在一样。

所以你得到的是<<<.右侧的单引号字符串。该字符串将作为 here 字符串,无需进一步处理。

然而,没有必要在整个单词周围只使用一组引号。您可以将多个带引号的部分(或未带引号的单个单词)连接在一起:

script <<< "$var 2"$'\n'"3 4"$'\n'"5 6"$'\n'q
Run Code Online (Sandbox Code Playgroud)

会做你想做的。

或者,您可以反斜杠转义空格,而不是引用"1 2".


您还可以使用echo -e常规管道:

echo -e "$var 2\n3 4\n5 6\nq" | script
Run Code Online (Sandbox Code Playgroud)

printf

printf '%s 2\n3 4\nq' "$var" | script
Run Code Online (Sandbox Code Playgroud)

-e是启用 inecho参数的转义处理所必需的。printf默认情况下会执行这些操作,但它有自己的插值系统(printf "$var 2\n3 4\nq"也可以使用,但如果$var可能包含转义字符则有问题)。