2017-06-12 219 views
0

我如何可以验证该替换命令成功:检查文件是否已被修改

perl -pi -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts 

我曾尝试检查返回值:

if [ $? -eq 0 ]; then 
    echo "OK" 
else 
    echo "Error." 
fi 

但返回值不被当设置该命令失败。

感谢

+0

当命令失败时,返回值不是0.它实际上被设置。 – zhenguoli

+0

检查https://stackoverflow.com/questions/15965073/return-code-of-sed-for-no-match –

+0

什么决定成功? ...同样失败了?无论命令是否与字符串匹配,您的命令都会修改该文件;目前还不清楚这是否是你认为是成功的。 –

回答

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的解决方案。

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

如果你希望你的perl脚本返回一个有意义的值,你需要编写你的perl脚本来返回一个有意义的值。在你的情况下,可能是这样简单的:

perl -p -e 's/contoso/'"$hostname"'/g; $rv=1 if $&; END{ exit !$rv }' 
0

通常,校验和是检测文件更改的一种非常有效的方法。

md5sum [filename] 

[email protected]:~# echo 'line 1' >>1.txt 
[email protected]:~# md5sum 1.txt 
5c2ce561e1e263695dbd267271b86fb8 1.txt 
[email protected]:~# echo 'line 2' >>1.txt 
[email protected]:~# md5sum 1.txt 
c7253b64411b3aa485924efce6494bb5 1.txt 

我想的总和可以从输出中提取与AWK

[email protected]:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "MD5:",$1}' 
MD5: c7253b64411b3aa485924efce6494bb5 

[email protected]:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "filename:",$2}' 
filename: 1.txt 

FS =“*”指示AWK分裂上的一个或多个空格的发生的字符串。 $ 1将是MD5,$ 2将是文件名。

对于任何大小的文件,MD5校验和都可以快速工作。缺点是你没有真正检测到文件中发生了什么变化,只是事实发生了变化。对于大多数场景应该足够好。

相关问题