shell bash:单引号在向文件追加文本时消失

hm2xizp9  于 2023-05-01  发布在  Shell
关注(0)|答案(1)|浏览(170)

我试图追加一个多行文本包含一些单引号(')的文件是目前在不同的机器上,只能通过不同的用户访问。下面是我的代码片段:

element_list=("element1" "element2")
for element in ${element_list[@]} 
do

read -r -d '\n' CONTENT << EOM
field1 = on
field2 = '$element'
field3 = '$element-random-text'
EOM

    CONFIG_FILE=/tmp/config.txt
    sshpass -p vm_password ssh -t vm_user@<vm-ip> "sudo su - other_user -c 'echo \"$CONTENT\" >> $CONFIG_FILE'"

done

虽然脚本成功执行,但field2和field3值中的单引号消失了。附加到文件的输出如下所示:

field1 = on
field2 = element1
field3 = element1-random-text
field1 = on
field2 = element2
field3 = element2-random-text

我也想把那些单引号转储到文件中。预期输出:

field1 = on
field2 = 'element1'
field3 = 'element1-random-text'
field1 = on
field2 = 'element2'
field3 = 'element2-random-text'

任何帮助将不胜感激。
注意:需要从不同的机器上使用other_user(而不是vm_user)执行此命令。

f1tvaqid

f1tvaqid1#

一个更简单的解决方案是在本地执行所有的扩展,然后只在管道的末尾写入结果。

config_file=/tmp/config.txt
element_list=("element1" "element2")
for element in "${element_list[@]}"
do
    read -r -d '\n' content <<____EOM
field1 = on
field2 = '$element'
field3 = '$element-random-text'
____EOM
    echo "$content"
done |
sshpass -p vm_password ssh -t vm_user@<vm-ip> "sudo su - other_user -c \"cat >> '$config_file'\""

捕获这里的文档,这样你就可以立即echo,这显然是浪费内存;我想你真实的的循环身体看起来更复杂。
私有变量不要大写;参见Correct Bash and shell script variable capitalization。为了健壮性,我还在${element_list[@]}周围添加了双引号;参见When to wrap quotes around a shell variable

相关问题