Microsoft Windows [Version 10.0.22631.4112]
(c) Microsoft Corporation. All rights reserved.
C:\Users\[ユーザ名]>where pwsh.exe
C:\Users\[ユーザ名]\AppData\Local\Microsoft\WindowsApps\pwsh.exe
Microsoft Windows [Version 10.0.22631.4112]
(c) Microsoft Corporation. All rights reserved.
C:\Users\[ユーザ名]>where powershell.exe
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
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