我遇到了一种情况,我试图在shell脚本中的远程shell上运行sed命令,并使用动态变量,结果一次又一次地出现相同的错误。
这是sed命令,它在本地shell上运行良好,没有任何错误。经过彻底的测试,我使用了这个正则表达式,相信我,它没有问题
sed -i 's/ #0t30718/ 0t30718/' ./config.txt
尝试使用ssh:在远程shell中运行此程序
ssh root@sys_name sed -i 's/ #0t30718/ 0t30718/' /absolute-path/vconfig.txt
当我尝试使用变量运行这个命令时。(30718和文件的路径是变量(:
ssh root@sys_name 'sed -i "s/0t${pe_list[0]}/#0t${pe_list[0]}/g" $file_path'
或者像这样:
ssh root@sys_name "sed -i 's/0t${pe_list[0]}/#0t${pe_list[0]}/g' $file_path"
我要么得到sed:-e表达式#1,char 2:unterminated‘s’命令错误,要么sed命令执行时不需要的输出与变量名匹配。基本上,简而言之,我想使用ssh在远程shell上执行sed命令,约束条件是整个命令是脚本的一部分,要匹配的值和文件名是该文件中的变量。
您在本地shell中设置了变量,但is不是sed变量,因此您应该退出ed环境,用单引号关闭它,放入您的变量,然后用单引号再次打开并继续se内容:
sed -e 's/Red Hat/'${z}'/' /etc/redhat-release
如果$z变量包含空格,则需要使用双引号:
sed -e 's/Red Hat/'"${z}"'/' /etc/redhat-release
最后,当您通过ssh发送命令时,您还将在整个命令周围添加双引号,因此该命令中使用的所有双引号都应该转义,否则这些双引号之间的所有内容都将在源主机上本地评估。所以这样做吧:
z="BLACK HAT"
ssh root@sys_name "sed -e 's/Red Hat/'"${z}"'/' /etc/redhat-release"
您将获得:
BLACK HAT Enterprise Linux Server release 6.10 (Santiago)