web-dev-qa-db-ja.com

ifステートメントに基づくBashフラグ

次のようにして、いくつかのフラグを持つbashスクリプトを呼び出しています。

/home/username/myscript -a -b 76

つまり、-aフラグはmyscriptで何かを行い、-bフラグはmyscriptでいくつかのパラメーターを76に設定します。

以前に定義した変数に基づいてこれらのフラグを条件付きにするにはどうすればよいですか?たとえば、ある変数var = ONの場合にのみ-aフラグを使用します。それ以外の場合は、そのフラグを使用する必要はありません。私は次のようなものを探しています:

var=ON
/home/username/myscript 
if [ "$var" == "ON" ]; then
-a
fi
-b 76

ただし、このスキームは実装時に機能しませんでした。望ましい結果を達成するために何を使用できますか?

1
theta

コマンドは配列で作成できます。

_#!/bin/bash
var=ON
cmd=( /home/username/myscript )   # create array with one element
if [ "$var" == "ON" ]; then
    cmd+=( -a )                   # append to the array
fi
cmd+=( -b 76 )                    # append two elements
_

そして、それを実行します:

_"${cmd[@]}"
_

最後の部分を囲む引用符と、上記の割り当てを囲む括弧に注意してください。構文は醜いですが、空白などを含む引数に直面しても機能します。 (スペースを含む引数を追加するには引用符を使用します。例:cmd+=("foo bar")

関連する、醜くない方法と失敗する方法:


単純なケースでは、ここでの1つのオプションの引数のように、代替の値展開で回避できます。

_var=x
myscript ${var:+"-a"} -b 76
_

ここで、fooが空でない場合、_${var:+foo}_はvarを挿入します(つまり、_var=ON_、_var=FALSE_、_var=x_はすべて挿入します)。空または未設定の場合は何もありません(_var=_、または_unset var_)。通常の引用問題に注意してください。

7
ilkkachu

私があなたを正しく理解している場合:

var=ON
if [ "$var" = "ON" ]; then
    /home/username/myscript -a -b 76
else
    /home/username/myscript -b 76
fi
1
Quasímodo