2017-06-12 4 views
0

私は、この置き換えるコマンドが成功したことを検証するにはどうすればよい:ときに設定されていないチェック

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

しかし、戻り値:私は、戻り値をチェックしようとしている

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

コマンドは失敗します。

おかげ

+0

コマンドが失敗すると、戻り値は0ではありません。実際には設定されています。 – zhenguoli

+0

check 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.orig/etc/inet/hostsのオリジナルコンテンツを保存します。次に、指定されたコマンドを実行します。その後、ファイルがと異なっている場合は、確認することができます例えばcmpコマンド:

if ! cmp -s foo.txt foo.txt.orig; then 
    echo OK 
else 
    echo ERROR 
fi 

はその後.ORIGファイルを削除します。

もう1つの方法は、ファイルの内容を読み込み、必要なエントリを置き換え、実際に起こったことを確認し、最後に正しい状態を返してシェル内で$?を使用して検証することです。 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で出力から抽出されることができると思います=「*」、1つ以上のスペースが発生した場合に文字列を分割するAWKを指示します。 $ 1がMD5、$ 2がファイル名になります。

MD5チェックサムは、任意のファイルサイズで高速に動作します。欠点は、ファイル内で正確に何が変更されたのかを実際には検出しないことです。変更されたという事実だけです。ほとんどのシナリオで十分であるはずです。