基本パラメータを提供する非常に単純なラッパーを作成する方法は?

基本パラメータを提供する非常に単純なラッパーを作成する方法は?

たとえば、いくつかのパラメータを必要とするプログラムがある場合、これらのパラメータの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。より多くの情報を見つけることができます。ここ

関連情報