在此处字符串中使用变量

在此处字符串中使用变量

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

script <<< $'1 2\n3 4\n5 6\nq'

这有效地进入

1 2
3 4
5 6
q

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

script <<< $'$var 2\n3 4\n...'

不起作用...

答案1

这不是这里的字符串,而是ANSI-C 引用:

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

所以你得到的是 右侧的单引号字符串<<<。该字符串被视为此处的字符串,无需进一步处理。

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

script <<< "$var 2"$'\n'"3 4"$'\n'"5 6"$'\n'q

会做你想做的事。

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


你也可以使用echo -e使用普通管道:

echo -e "$var 2\n3 4\n5 6\nq" | script

或者printf:

printf '%s 2\n3 4\nq' "$var" | script

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

答案2

ANSI $'...'-C 引用会产生“单引号”字符串。
在单引号字符串内变量不会被扩展:

$ var=13

$ echo 'test $var'
test $var

您需要从这样的结构中取出变量。国际海事组织最简单的方法是:

$  printf -v val '%s 2\n3 4\n5 6\nq' "$var"
13 2
3 4
5 6
q

to 的格式printf与之前的格式非常相似,并且 被%s替换为变量的值。为了获得变量中的结果,我们可以使用 bash printf 设置变量的功能:

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"
$ script <<< "$val"

全部在一行:

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"; script <<< "$val"

相关内容