シェルスクリプトでコマンドライン変数を宣言する方法は?

シェルスクリプトでコマンドライン変数を宣言する方法は?

次のように、シェルスクリプトのコマンドライン引数で変数を宣言したいと思います。

./script.sh

file=/tmp/domains.txt 
domain=abcd.com**

同じように助けてください。

答え1

これらの変数を指定して渡すことができます。今後たとえば、コマンド名です。

file=/tmp/domains.txt domain=abcd.com ./script.sh

これにより、シェルスクリプトが実行される前にこれらの変数が環境に配置されます。つまり、他の変数と同様に、シェルスクリプトでこれらの変数を使用できます。

答え2

このような変数を渡すことは可能ですが、ユーザーはスクリプトの内部構造を理解する必要があります。また、スクリプトに完全に関連していない他の理由で変数が環境で定義されている場合(ユーザーがスクリプトを実行するときにコマンドラインでその変数を設定することを忘れた場合)、奇妙で説明できない動作が発生する可能性があります。

より良いアプローチは、シェルの組み込みオプションであるparsingを使用することですgetopts

usage() {
    # print some help text here, e.g.
    echo Usage:
    echo "      $0 [-f filename] [-d domainname]"
}

# -f and -d are the only valid options and they both
# take strings as arguments.
while getopts f:d: opt; do
  case "$opt" in
     f) file="$OPTARG" ;;
     d) domain="$OPTARG" ;;
     *) usage ; exit 1 ;;
  esac
done
shift $(expr $OPTIND - 1)

# print help message and exit if either file or domain are
# empty.
[ -z "$file" ] && usage && exit 1
[ -z "$domain" ] && usage && exit 1

詳細については、シェルのマニュアルページ(たとえばman bash、または)を参照してください。man dashbashの組み込みhelpコマンドも有用な情報を提供しますgetoptshelp getopts

--fileGNUスタイルの長いオプション(たとえば--domain)と短いオプション、およびを-f使用するには、パッケージ内のプログラムを-d使用できます。内蔵には「s」はありませんが、「s」はありません。getoptutil-linuxgetoptgetopts

getoptgetopts私は--longオプションが好きなので、通常util-linuxを使用します....

関連情報