为了将输入提供给交互式脚本,我一直在使用此处字符串:
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
-e
echo
对于在 的参数中启用转义处理是必要的。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"