- ベストアンサー
bashのcase文について
- bashのcase文を使ったシェルスクリプトについての質問です。
- 引数で受け取ったファイル名の先頭文字によって処理を分岐させたいです。
- ファイル名がaから始まる場合はファイル名と行数を表示し、bから始まる場合はファイルの内容を表示します。それ以外の場合はファイル名とerrorを表示します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
freetakaさんの回答は細かいところで惜しい。 仕様通りになってません。 filename=`basename "$1"` case "$filename" in a*) echo FILE: "$filename" is `wc -l <"$1"` lines ;; b*) cat "$1" ;; *) echo error. FILE: "$filename" ;; esac 最後のエラー表示は、"$filename" じゃなくて "$1" のほうが良いかもしれません。
その他の回答 (3)
- freetaka
- ベストアンサー率53% (106/197)
shiro857さんへ 質問をよく読まずに回答してしまいました aとbの時の動作が一緒と勘違いしていたのと どちらでもない場合にファイル名の表示がない等 シェルスクリプトの内容に不備がありますので notnotさんの回答が正しいです 大変申し訳ありません 内容だけcase文の参考としてください
- freetaka
- ベストアンサー率53% (106/197)
notnotさんへ ご指摘ありがとうございます 質問者さんの質問にファイル名とerrorの表示とありますね ファイル名の表示だけが抜けていました(汗)
- freetaka
- ベストアンサー率53% (106/197)
ファイル名を取り出すのにbasenameを使うのはOKですが パイプでwcコマンドにそのままファイル名を渡しても 行数としてはファイル名しかwcコマンドに渡していないので 1しか結果が返ってきません なので行数を知りたいのであれば cat $1 | wc -l のようにファイル内容のすべてをwcコマンドに渡します 次にcase文でファイル名の先頭がaまたはbではじまるかを 判断したいのであれば 1.コマンドの結果をそのままcase文に利用 2.正規表現を使用する 等があります どれにもマッチングしない場合は*を指定します コマンドの結果をそのままcase文に利用すると コマンド部分をバッククォーテーションで囲み こんな感じになります #!/bin/bash case `basename $1` in a*) 処理;; b*) 処理;; *) パターン以外の場合の処理;; esac ファイル名を再利用する可能性があるのであれば 処理部分でまた同じコマンドを使用する等無駄になるので 変数にいれておくといいと思います 例 #!/bin/bash str=`basename $1` num=`cat $1 | wc -l` case $str in a*) echo "${str} 行数:${num}";; b*) echo "${str} 行数:${num}";; *) echo "error";; esac 複数指定でマッチングを1つにまとめれるので case文の部分を次のようにも書けます case $str in a*|b*) echo "${str} 行数:${num}";; *) echo "error";; esac これを使うと大文字判定もいれることができたりします 例 #!/bin/bash str=`basename $1` num=`cat $1 | wc -l` case $str in a*|b*|A*|B*) echo "${str} 行数:${num}";; *) echo "error";; esac 正規行現を使用するとこんな感じです #!/bin/bash str=`basename $1` num=`cat $1 | wc -l` case $str in [a-bA-B]*) echo "${str} 行数:${num}";; *) echo "error";; esac それと basenameコマンドに空の引数が渡されると エラーになると思うので その場合は処理をしないように if文等で制御するといいと思います スクリプトの実行テストしないで直接回答してるので もしエラーでたらごめんなさい 以上参考までに
お礼
freetakaさんいつも回答ありがとうございます。 私ももう少しわかりやすく質問を書くべきでした。 いつも素早い回答で助かっています。感謝しています。 また何回か質問する機会があると思いますのでその際はまたよろしくお願いします。