私は、この置き換えるコマンドが成功したことを検証するにはどうすればよい:ときに設定されていないチェック
if [ $? -eq 0 ]; then
echo "OK"
else
echo "Error."
fi
しかし、戻り値:私は、戻り値をチェックしようとしている
perl -pi -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts
コマンドは失敗します。
おかげ
私は、この置き換えるコマンドが成功したことを検証するにはどうすればよい:ときに設定されていないチェック
if [ $? -eq 0 ]; then
echo "OK"
else
echo "Error."
fi
しかし、戻り値:私は、戻り値をチェックしようとしている
perl -pi -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts
コマンドは失敗します。
おかげ
ファイルが変更されているかどうかをチェックすることもできます。あなたは-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に解決策がありました。
私は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
コマンドを使ってより良い方法があると思います。しかし、それは動作するはずです。
あなたのperlスクリプトが何らかの意味を持つ値を返すことを期待するなら、意味のある値を返すためにperlスクリプトを書く必要があります。あなたの場合、おそらく単純なもの:
perl -p -e 's/contoso/'"$hostname"'/g; $rv=1 if $&; END{ exit !$rv }'
通常、チェックサムはファイルの変更を検出する非常に効率的な方法です。
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チェックサムは、任意のファイルサイズで高速に動作します。欠点は、ファイル内で正確に何が変更されたのかを実際には検出しないことです。変更されたという事実だけです。ほとんどのシナリオで十分であるはずです。
コマンドが失敗すると、戻り値は0ではありません。実際には設定されています。 – zhenguoli
check https://stackoverflow.com/questions/15965073/return-code-of-sed-for-no-match –
成功を左右する要因は何ですか? ...と同様に失敗?あなたのコマンドは、文字列と一致するかどうかにかかわらずファイルを変更します。それがあなたが成功したと思っているのかどうかは不明です。 –