使用 Eval 将变量设置为等于多行字符串

jef*_*amp 0 bash awk eval

我正在尝试使用 eval 设置多行变量

$ k="A
B
C"

$ echo "$k"
A
B
C

$ eval 'k="1
2
3"'

$ echo "$k"
1
2
3
Run Code Online (Sandbox Code Playgroud)

但我想使用 awk 通过 awk 脚本生成我的变量

$ echo "$k" | awk 'BEGIN{RS="";FS="[ \t]+"}{print "awkV=\""$0"\""}' 
awkV="1
2
3"

$ eval `echo "$k" | awk 'BEGIN{RS="";FS="[ \t]+"}{print "awkV=\""$0"\""}'`
$ echo "$awkV"
1 2 3

$ eval '`echo "$k" | awk 'BEGIN{RS="";FS="[ \t]+"}{print "awkV=\""$0"\""}'`'
-bash: unexpected EOF while looking for matching ``'
-bash: syntax error: unexpected end of file
bash: awkV="-bash"}`: command not found...

Run Code Online (Sandbox Code Playgroud)

我需要在 eval 语句周围加上某种引号,但我在内部使用单引号和双引号,单引号可能会弄乱我在脚本内使用的“$k”。我尝试将执行的代码放入定界符中,但没有成功,尽管也许我做错了。

帮助和建议将不胜感激。

请注意,这只是问题的一个最小示例,而不是我的完整应用程序。

Ed *_*ton 5

按原样重用您的 awk 脚本并假设您确实有充分的理由想要这样做:

$ eval "$(echo "$k" | awk 'BEGIN{RS="";FS="[ \t]+"}{print "awkV=\""$0"\""}')"
Run Code Online (Sandbox Code Playgroud)

$ echo "$awkV"
A
B
C
Run Code Online (Sandbox Code Playgroud)

请参阅https://mywiki.wooledge.org/BashFAQ/082,了解使用命令替换而$(...)不是旧的、脆弱的、古怪的反引号的原因和其他原因。