if cp from to; then
echo "コピーに成功しました"
else
echo "コピーに失敗しました"
fi
という記事を見つけた。
cpのExit Statusは0は成功、0以外はエラーなので、上のコードで大正解なのだが、気に入らないらしい。
わざわざgrepを持ち出して、grep ‘[‘なら文法エラーで$?に2が入るから
if echo test | grep '['; then
echo "文字列が見つかりました"
else
case $? in
1) echo "文字列が見つかりません" ;;
2) echo "エラーが発生しました(終了ステータス: $?)" ;;
esac
fi
うううん。素晴らしい。(だそうだ
だが、そうだろうか?
2) の後の$?は必ず 2 になるハズだから、
この組み合わせには不整合の臭いがする。
ちなみに
grepのExit Statusは
grepのステータス | 意味 |
0 | 一致が見つかりました。 |
1 | 一致が見つかりませんでした。 |
>1 | 構文エラーが見つかったか、(一致が見つかったとしても) ファイルにアクセスできませんでした。 |
らしいので、明日にでも、>2が実装されれば、その事象が発生すると先のコードでは何も表示しないのだ。
よって・・・
if echo test | grep '['; then
echo "文字列が見つかりました"
else
case $? in
1) echo "文字列が見つかりません" ;;
2) echo "grepのオプションの構文エラーな気がする" ;;
*) echo "ボクの知らないエラーが発生しました(終了ステータス: $?)" ;;
esac
fi
が良い様な気がする。
今は想定外である( 3とか4など )な結果に対して、デグレードしているのは良くない。(と思う。
とかく、
- ソースコードの書き方がよろしくない!
- ソースコードが美しくない!
- カバレッジテストで通らないコードがある!
な記事の多くには、バグ(あるいはデグレード)が含まれている。
主に経験不足なんだろうけど、そう云う香り(臭いではない)を楽しむのも風流かもしれない。
そもそもシェルファイル内で検索したい文字列をべた書きする事は稀で
WORD= "9999"
TEXT= "9999"
if echo $TEXT | grep $WORD ; then
echo "$WORDが見つかりました"
else
case $? in
1) echo "'$WORD'が見つかりません" ;;
2) echo "'$WORD'検索中にgrepのオプションの構文エラーが起きた気がする" ;;
*) echo "'$WORD'検索中に不明なエラー($?)が発生しました" ;;
esac
fi
の様に書く事が多い。
だって!
上のコードで云えば、grep 9999 と書けば
マジックナンバー扱いになるじゃないですかねぇ~(笑
それにechoの出力に検索したいテキストを埋め込むことも考えに入っていない。
そもそも・・・・・・・・
最初のコードに(終了ステータス: $?)を追記して
if cp from to; then
echo "コピーに成功しました"
else
echo "コピーに失敗しました(終了ステータス: $?)"
fi
とするだけでデメリット?らしいとこも無くなる。
やはり、
経験がかなり不足していると思える
て云うか、WindowsのBATファイルより少しマシな程度のものだから
デバッグのしやすさの方が優先するならソースデバッガが使えるpythonやnode.jsで書いた方が楽。
話がそれるけど・・・
man コマンド名でExit statusが見つけにくい
様に思う。
オプション多すぎ。