Bashスクリプトから別のプログラムを呼び出しますが、コマンドラインオプションを使用してそのプログラムを設定したいと思います。以下はうまくいきます:
AREA_ARG=""
if __SOME_SETTING__ ; then
AREA_ARG=" --area us,ca "
fi
process_data -i /some/path $AREA_ARG
つまり、bash実行process_data -i /some/path
またはprocess_data -i /some/path --area us,ca
。
しかし、shellcheck
文句!
$ shellcheck test.sh
In test.sh line 7:
process_data -i /some/path $AREA_ARG
^-------^ SC2086: Double quote to prevent globbing and word splitting.
Did you mean:
process_data -i /some/path "$AREA_ARG"
For more information:
https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...
私は真実を理解していますが、考える/必要2つの引数を得るために空間的に分割される変数ですprocess_data
。
これを行う正しい方法は何ですかbash
?
答え1
配列の使用
配列を使用して書き換えたコードは次のとおりです。また、作業例(ls
コマンドの代わりに)であり、正しい変数の大文字と小文字を使用します(コーディング標準では、大文字の名前がシステムに予約されていることを示します)。
#!/bin/bash
area_args=()
if true ; then
area_args=(-l -a)
fi
ls "${area_args[@]}"
答え2
特定のユースケースに対するより簡単な答えがあります。
unset -v area
if __SOME_SETTING__; then
area="ca,us"
fi
process_data -i /some/path ${area+ --area "$area" }
何らかの理由で配列が利用できない場合そして上記のケースで提供するよりも多くの制御が必要な場合は、関数ラッパーの使用を検討できます。
withOptionalArea() {
if __SOME_SETTING__; then
"$@" --area us,ca
else
"$@"
fi
}
withOptionalArea process_data -i /some/path
...しかし、これは特別な状況でのみ必要です。
実際に配列を使用してください。
答え3
任意のコマンドまたはパラメータを変数に保存する正しい方法は、配列を使用することです。変数に保存されたコマンドをどのように実行できますか?
しかし、それが大丈夫だと確信している限り、Shellcheckはそのまま好きだと言うことができます(つまり、そのままにしておく必要があるスペースや問題を引き起こす可能性があり、変更されていないグローバル文字はありません)。IFS
これを台無しにすることによって):
AREA_ARG=""
if __SOME_SETTING__ ; then
AREA_ARG=" --area us,ca "
fi
# shellcheck disable=SC2086 # split on purpose
process_data -i /some/path $AREA_ARG