如何验证此替换命令是否成功:
perl -pi -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts
我试过检查返回值:
if [ $? -eq 0 ]; then
echo "OK"
else
echo "Error."
fi
但是当命令失败时,没有设置返回值。
由于
答案 0 :(得分:1)
我不知道Perl,但是您可以使用一点Bash脚本管理多个“错误”(无法匹配/无法写入文件)的情况:
#!/bin/bash
FILE="/etc/inet/hosts"
SEARCH="contoso"
REPLACE="$hostname"
NB=$(grep -c $SEARCH $FILE)
if [ $NB -ne 0 ]; then
perl -pi -e 's/${SEARCH}/'${REPLACE}'/g' "$FILE" && echo "${NB} replaced" || echo "Error (permission maybe)"
else
echo "No match in file"
fi
我认为通过改进Perl代码或使用sed
命令有更好的方法。但它应该有效。
答案 1 :(得分:1)
如果您希望perl脚本返回具有某种含义的值,则需要编写perl脚本以返回有意义的值。在你的情况下,也许就像这样简单:
perl -p -e 's/contoso/'"$hostname"'/g; $rv=1 if $&; END{ exit !$rv }'
答案 2 :(得分:1)
一个选项是检查文件是否已被修改。您可以通过将备份文件的扩展名添加到-i
选项来实现:
perl -pi.orig -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts
此命令会将/etc/inet/hosts
的原始内容存储到/etc/inet/hosts.orig
中。然后运行指定的命令。然后,您可以检查文件是否不同,例如cmp
命令:
if ! cmp -s foo.txt foo.txt.orig; then
echo OK
else
echo ERROR
fi
之后删除.orig文件。
另一个选项是修改脚本以读取文件的内容,替换所需的条目,检查实际发生的更改并在最后返回正确的状态以使用$?
在shell中进行验证。您已在this answer中获得解决方案。
答案 3 :(得分:0)
通常,校验和是检测文件更改的一种非常有效的方法。
md5sum [filename]
root@miaoulis:~# echo 'line 1' >>1.txt
root@miaoulis:~# md5sum 1.txt
5c2ce561e1e263695dbd267271b86fb8 1.txt
root@miaoulis:~# echo 'line 2' >>1.txt
root@miaoulis:~# md5sum 1.txt
c7253b64411b3aa485924efce6494bb5 1.txt
我猜这个总和可以用AWK从输出中提取
root@miaoulis:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "MD5:",$1}'
MD5: c7253b64411b3aa485924efce6494bb5
root@miaoulis:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "filename:",$2}'
filename: 1.txt
FS =“*”指示AWK在出现一个或多个空格时拆分字符串。 $ 1将是MD5,$ 2将是文件名。
MD5校验和适用于任何大小的文件。缺点是你没有真正检测到文件中的确切变化,只是它已经改变了。对于大多数情况来说应该足够好了。