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)
不起作用...
那不是 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
可能包含转义字符则有问题)。