Shellcheckは、bashスクリプトのコマンドに変数の2つの引数を渡す方法を承認しました。

Shellcheckは、bashスクリプトのコマンドに変数の2つの引数を渡す方法を承認しました。

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

バラよりhttps://www.shellcheck.net/wiki/Directive

答え4

=多くのパラメータ解析ライブラリでは、シンボルを使用して長いオプション名とその値を関連付けることができます。 (ここには以下が含まれます。ヌリップパーサーとPython標準引数の解析中図書館。 )このようなプログラムを呼び出して、より一般性が必要ない場合は、次のように使用できます。

AREA_ARG=--area=us,ca

関連情報