いくつかのパラメータを必要とするプログラムを考えてみましょう。 program -in file.in -out file.out
、これらのパラメーターの有無にかかわらず呼び出され、それぞれにデフォルト値を使用するbashスクリプトを作成する最も簡単な方法は何ですか?
script -in otherfile
はprogram -in otherfile -out file.out
を実行します、script -out otherout -furtherswitch
はprogram -in file.in -out otherout -furtherswitch
などを実行します.
デフォルト値はBashで簡単に定義できます。
foo="${bar-default}" # Sets foo to the value of $bar if defined, "default" otherwise
foo="${bar:-default}" # Sets foo to the value of $bar if defined or empty, "default" otherwise
パラメータを処理するには、単純なループを使用できます。
while true
do
case "${1-}" in
-in)
infile="${2-}"
shift 2
;;
-out)
outfile="${2-}"
shift 2
;;
*)
break
;;
esac
done
program -in "${infile-otherfile}" -out "${outfile-otherout}" "$@"
有用な読み取り:
代わりにgetopt
を使用することもお勧めします。これは、コードを非常にすばやく複雑化して混乱させる多くの特殊なケースを処理できるためです( 重要な例 )。
l0b0の答えは、割り当てを介してデフォルト値を設定し、別の変数の状態をチェックする方法を示しています(もちろん、割り当て先の同じ変数でこれを実行することもできます)が、同じことを行うより簡潔な方法があります:
: "${foo=bar}" # $foo = bar if $foo is unset
: "${foo:=bar}" # $foo = bar if $foo is unset or empty
いつものように、シンプルとハードの2つの方法があります。たとえば、内部変数を使用するのが簡単です。
program -in otherfile -out file.out
ここで変数は
$ 0 =スクリプト名
$ 1 = -in
$ 2 = otherfileなど.
難しい方法はgetopt
を使用することです。詳細は here を参照してください。
script
に渡されたすべてのパラメーター($*
)をprogram
にも渡しますサンプルコード
interested_parameter_names=(-in -out)
default_parameter_values=(file.in file.out)
program=echo
cmd="$program $*"
for ((index=0; index<${#interested_parameter_names[*]}; index++))
do
param="${interested_parameter_names[$index]}"
default_value="${default_parameter_values[$index]}"
if [ "${*#*$param}" == "$*" ] # if $* not contains $param
then
cmd="$cmd $param $default_value"
fi
done
echo "command line will be:"
echo "$cmd"
echo
echo "execute result:"
$cmd
$interested_parameter_names
と$default_parameter_values
に配列要素を追加することで、簡単にデフォルトのパラメーター/値を追加できます。
サンプル出力
$ ./wrapper.sh -in non-default.txt -other-params
command line will be:
echo -in non-default.txt -other-params -out file.out
execute result:
-in non-default.txt -other-params -out file.out
注
スペースを含むパラメーターを渡す場合は、引用符で囲むのではなく、\
でエスケープする必要があります。例:
./script -in new\ document.txt