web-dev-qa-db-ja.com

デフォルトのパラメータを提供する非常にシンプルなラッパーを作成する方法は?

いくつかのパラメータを必要とするプログラムを考えてみましょう。 program -in file.in -out file.out、これらのパラメーターの有無にかかわらず呼び出され、それぞれにデフォルト値を使用するbashスクリプトを作成する最も簡単な方法は何ですか?

script -in otherfileprogram -in otherfile -out file.outを実行します、
script -out otherout -furtherswitchprogram -in file.in -out otherout -furtherswitchなどを実行します.

5
Tobias Kienzler

デフォルト値は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を使用することもお勧めします。これは、コードを非常にすばやく複雑化して混乱させる多くの特殊なケースを処理できるためです( 重要な例 )。

7
l0b0

l0b0の答えは、割り当てを介してデフォルト値を設定し、別の変数の状態をチェックする方法を示しています(もちろん、割り当て先の同じ変数でこれを実行することもできます)が、同じことを行うより簡潔な方法があります:

: "${foo=bar}" # $foo = bar if $foo is unset
: "${foo:=bar}" # $foo = bar if $foo is unset or empty
3
Chris Down

いつものように、シンプルとハードの2つの方法があります。たとえば、内部変数を使用するのが簡単です。

program -in otherfile -out file.out

ここで変数は

$ 0 =スクリプト名
$ 1 = -in
$ 2 = otherfileなど.

難しい方法はgetoptを使用することです。詳細は here を参照してください。

1
Ilja
  • 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
1
LiuYan 刘研