
私が使っているシェルスクリプトのほとんどは次のような構文を持っています
./shellscript.sh -first_argument_flag <first_argument_value> -second_argument_flag <second_argument_value>
しかし、シェルスクリプト作成者向けのオンラインリソースはすべて、位置引数の受け渡しについてのみ説明しています。
./shellscript.sh <first_argument_value> <second_argument_value>
これらは、スクリプト内では"$1"
、、"$2"
などとして使用されます。
位置引数構文ではなく、最初のよりユーザーフレンドリーな構文を使用したいと思います。例として、フラグ-fでファイル名をエコーし、フラグ-dでディレクトリをエコーするとします。このスクリプトをechofd.shと呼びます。
./echofd.sh -f myfile.txt -d /my/directory/
出力を生成する
あなたのファイル: myfile.txt
あなたのディレクトリは: /my/directory/
スクリプトの呼び出し時に -f と -d がどの順序で配置されているかは関係ありません。
答え1
そこにはgetopts
標準(組み込み)ユーティリティPOSIX シェルでコマンドライン引数を解析します。
次のテンプレートを使用できます:
#! /bin/sh -
PROGNAME=$0
usage() {
cat << EOF >&2
Usage: $PROGNAME [-v] [-d <dir>] [-f <file>]
-f <file>: ...
-d <dir>: ...
-v: ...
EOF
exit 1
}
dir=default_dir file=default_file verbose_level=0
while getopts d:f:v o; do
case $o in
(f) file=$OPTARG;;
(d) dir=$OPTARG;;
(v) verbose_level=$((verbose_level + 1));;
(*) usage
esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments: "$@"
これは、他の標準コマンドと同様に、標準的な方法で引数を解析します。たとえば、次のように呼び出すことができます。
myscript -vvv -f file -d dir other arg
myscript -ffile -ddir -- other arg
見るPOSIX仕様詳細については、またはシェルのマニュアルを参照してください。
答え2
#!/bin/bash
myfile=''
mydir=''
parse_args() {
case "$1" in
-d)
mydir="$2"
;;
-f)
myfile="$2"
;;
*)
echo "Unknown or badly placed parameter '$1'." 1>&2
exit 1
;;
esac
}
while [[ "$#" -ge 2 ]]; do
parse_args "$1" "$2"
shift; shift
done