ファイルに提供された$OPTARGに基づいて検索するにはどうすればよいですか?

ファイルに提供された$OPTARGに基づいて検索するにはどうすればよいですか?

特定のテキストを検索するための実行可能ファイルを作成しようとしています。私が渡した値を含むデータファイルのすべての行を検索したいと思います。だから私はというデータファイルと呼ばれる.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取り除く

関連情報