我有以下脚本定义了旧字符串和新字符串。我想通过远程连接使用 sed 将旧的替换为新的。除了 sed 之外的所有命令似乎都可以工作。我尝试调整标点符号并使用管道而不是正斜杠与 sed 无济于事。从命令提示符执行 sed 命令可以,但在脚本中则不行。我将不胜感激任何对此的意见。
#!/bin/ksh
OLD="command\[Check_Memory_OS_10038\]=/opt/tools/nagitem/libexec/check_mem.pl -w 80,10 -c 90,25";export OLD
NEW="command\[Check_Memory_OS_10038\]=/opt/tools/nagitem/libexec/check_mem_ng.sh -w 80 -c 90";export NEW
DEST1="/opt/tools/nagitem/libexec/"
DEST2="/opt/tools/nagitem/nrdp/clients/nrds/"
for x in `cat /home/joe/nagios/hostlist`
do
SSH_STATUS=$(ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $USER@$x "pwd" >/dev/null)
if [[ $? = "0" ]];then
scp -p /home/joe/nagios/check_mem_ng.sh $x:/tmp
ssh -o "StrictHostKeyChecking no" $x "sudo /usr/localcw/bin/eksh -c '/bin/cp /tmp/check_mem_ng.sh $DEST1;chown nagitem:nagitem $DEST1/check_mem_ng.sh;cd $DEST2; /bin/sed -i -e 's/'$OLD'/'$NEW'/g' /opt/tools/nagitem/nrdp/clients/nrds/nrds.cfg '"
else
echo "Cannot connect to $x" >> badhosts
fi
done
收到的错误是:/bin/sed:-e表达式#1,字符39:“s”的未知选项
答案1
您的这段代码需要在几个地方进行彻底修改。
$OLD
环境变量n的初始化$NEW
在下游使用反斜杠时不使用转义,以免它们被双重转义。- 转义 $OLD var,以便可以安全地插入 sed 替代命令的 LHS。
- 同样,转义 $NEW var 以用于替代命令的 RHS。
- sed 命令在双引号的整体范围内使用单引号内的单引号,因此它们被转义,同时也要注意转义新或旧 var 值中的任何单引号。
#!/bin/ksh
OLD="command[Check_Memory_OS_10038]=/opt/tools/nagitem/libexec/check_mem.pl -w 80,10 -c 90,25";export OLD
NEW="command[Check_Memory_OS_10038]=/opt/tools/nagitem/libexec/check_mem_ng.sh -w 80 -c 90";export NEW
DEST1="/opt/tools/nagitem/libexec/"
DEST2="/opt/tools/nagitem/nrdp/clients/nrds/"
#--------------------
# escape variables
eOLD=$(printf '%s\n' "$OLD" | sed -e 's:[][\/^$.*]:\\&:g' -e "s:':&\\&&:g")
eNEW=$(printf '%s\n' "$NEW" | sed -e 's:[\/&]:\\&:g' -e "s:':&\\&&:g")
#--------------------
for x in `cat /home/joe/nagios/hostlist`
do
SSH_STATUS=$(ssh -n -o BatchMode=yes -o StrictHostKeyChecking=no $USER@$x "pwd" >/dev/null)
if [[ $? = "0" ]];then
scp -p /home/joe/nagios/check_mem_ng.sh $x:/tmp
ssh -o "StrictHostKeyChecking no" $x "sudo /usr/localcw/bin/eksh -c '/bin/cp /tmp/check_mem_ng.sh $DEST1;chown nagitem:nagitem $DEST1/check_mem_ng.sh;cd $DEST2; /bin/sed -i -e '\\''s/$eOLD/$eNEW/g'\\'' /opt/tools/nagitem/nrdp/clients/nrds/nrds.cfg'"
else
echo "Cannot connect to $x" >> badhosts
fi
done
答案2
您用单引号引用 eksh 参数'
。在单引号内,无法扩展特殊字符。所以你的$DEST
变量和其他变量没有扩展,留下了一些奇怪的残差。