変数の内容を確認したら、確認用の行を削除するのではなく、行の先頭に「#」記号を入れておくとよいでしょう。「#」以降はコメント扱いになるため、実行されなくなります(本連載第22回参照)。また、確認したくなったら「#」を削除します。
このように、スクリプトの中のコマンド行を、「#」でコメント扱いにして一時的に無効にすることを“コメントアウトする”といいます。
#echo "ptn:$ptn file:$file dir:$dir" #変数の内容を確認 grep -Hn -e "$ptn" -r --include="$file" "$dir"
さて、先ほどのgrepallでは、1つ目の引数(検索文字列)が指定されていなかったら、すぐに「exit」で終了しています。しかし、何も表示しないで終了すると、何も見つからなかったのか、それとも使い方が違っていたのかどうかが分かりません。
そこで、1つ目の引数が指定されていなかったら、使い方を表示するようにしてみましょう。以下の例では入力しやすいように英文字だけを使用していますが、もちろん、日本語でも構いません。
ここでは、使用方法として「USAGE: $0 pattern [file] [dir]」のように、スクリプト名を直接書かずに「$0」で参照しています。このようにしておくことで、今後スクリプト名を変更しても、使い方を表示している箇所を変更する必要がなくなります。
#! /bin/bash if [ -n "$1" ] #1つ目の引数が指定されている? then ptn="$1" else echo "USAGE: $0 pattern [file] [dir]" #使用方法を表示 exit fi (以下は同じ)
「echo $0」のように「$0」をそのまま出力すると、例えば「./grepall」のようにパス付きで実行している場合、使用方法も「USAGE: ./grepall …」のようにパス付きで表示されてしまいます。
常にファイル名だけを表示するようにしたい場合は、「basename」コマンドと組み合わせます。basenameは「basename ファイル名」で、ファイル名からパス名部分(「/」記号より前の部分)を取り除くことができるコマンドです。逆に、パス名部分だけを取り出したい場合は「dirname」コマンドを使います。「dirname ファイル名」でファイルのパス名だけが表示されます。
今回の場合、「basename $0」の結果をechoコマンドで表示したいのでバッククオートを使用しています。
#! /bin/bash if [ -n "$1" ] #1つ目の引数が指定されている? then ptn=$1 else echo "USAGE: `basename $0` pattern [file] [dir]" exit fi if [ -n "$2" ] #2つ目の引数が指定されている? then file="$2" #指定されていれば変数fileに保存 else file="*" #指定されていなかったら"*"(全てのファイル)を対象にする fi if [ -n "$3" ] #3つ目の引数が指定されている? then dir="$3" #指定されていれば変数dirに保存 else dir="." #指定されていなかったらカレントディレクトリを対象にする fi #echo "ptn:$ptn file:$file dir:$dir" #変数の内容を確認 grep -Hn -e "$ptn" -r --include="$file" "$dir"
$ ./grepall USAGE: grepall pattern [file] [dir]
西村 めぐみ(にしむら めぐみ)
PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。
Copyright © ITmedia, Inc. All Rights Reserved.