特定のテキストを検索するための実行可能ファイルを作成しようとしています。私が渡した値を含むデータファイルのすべての行を検索したいと思います。だから私はというデータファイルと呼ばれる.addr_book
実行可能ファイルを作成しました。lookup.ksh
Lookuo.ksh:
#!/bin/ksh
while getopts ":a:" option;
do
case $option in
a)
echo searching for $OPTARG
cat .addr_book | grep -o '$OPTARG.*'
;;
*)
echo "invalid option -$OPTARG"
;;
esac
done
ファイルを実行すると、./lookup.ksh -a test
次のように表示されます。searching for test
.addr_book | grep -o '$OPTARG.*'
猫に何か問題があると思います。
どんな助けでも大変感謝します。
答え1
変数拡張の周囲に一重引用符を使用すると、シェルが変数を拡張できなくなります。二重引用符を使用する必要があります。
改善のための提案は次のとおりです。
#!/bin/sh
while getopts "a:" option; do
case $option in
a) word=$OPTARG ;;
*) echo 'error' >&2
exit 1
esac
done
if [ -z "$word" ]; then
echo 'Missing word to search for' >&2
exit 1
fi
printf 'Searching for "%s"\n' "$word"
grep -o "$word.*" .addr_book
いくつか変更しました。
- スクリプトは
ksh
特定の機能を使用せず、スクリプトで作成しました/bin/sh
。 - スクリプトの主要部分()からコマンドライン解析を
grep
分離しました。これにより、スクリプトのメンテナンスが容易になります。 :
文字列の最初の文字は、誤ったコマンドライン引数を直接処理することgetopts
を示します。getopts
ソースからの一般的な診断メッセージでgetopts
十分なので、これはほとんど必要ありません。- 診断メッセージ(エラーメッセージや警告など、スクリプトの通常の出力に含まれていないもの)は、標準エラーストリーム(
>&2
)に送信する必要があります。 - 検索する用語が見つからないか空の場合、診断メッセージが生成されます。
- 変数データの出力は完了に使用する必要があります
printf
。 cat
取り除く