たとえば、いくつかのパラメータを必要とするプログラムがある場合、これらのパラメータの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
、等。
答え1
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
また、コードを複雑で混乱させる可能性がある多くの特殊なケースを処理する能力のために使用することをお勧めします(重要な例)。
答え2
l0b0の答えは、値を割り当て、他の変数の状態を確認してデフォルト値を設定する方法を示しています(もちろん、値を割り当てたい同じ変数でこれを行うこともできます)。同じもの:
: "${foo=bar}" # $foo = bar if $foo is unset
: "${foo:=bar}" # $foo = bar if $foo is unset or empty
答え3
- すべての引数(
$*
)を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
答え4
いつものように、簡単な方法と難しい方法の2つがあります。簡単なことは、次の内部変数を使用することです。
program -in otherfile -out file.out
ここで変数は
$0 = スクリプト名
$1 = -in
$2 = その他のファイルなど
難しい方法は使用することですgetopt
。より多くの情報を見つけることができます。ここ。