空のパラメータをコマンドに渡す方法

空のパラメータをコマンドに渡す方法

だから私はこれを持っています:

export ti_arg='';

if [[ -t 1 ]] ; then
   # allow us to kill container if attached to terminal
   export ti_arg='-ti'
fi

(
  cd "$(dirname "$BASH_SOURCE")"


  docker build <...> '.'


  docker run "$ti_arg" --rm  "test-$commit_id"
)

問題は、$ ti_argが空であるにもかかわらず、シェルがそれを引数として処理して次のような結果を得ることです。

docker: 無効な参照形式

私が考えることができる唯一の解決策は、基本的に同じif / else dockerコマンド(該当する引数を除く)を実行するか、次のようにdockerで使用できる転送引数を見つけることです。

export ti_arg='--noop';

if [[ -t 1 ]] ; then
   # allow us to kill container if attached to terminal
   export ti_arg='-ti'
fi

誰も良い解決策を持っていますか? CLIデザインは常に--noopこのユースケースのフラグを提供するようです。

ベストアンサー1

それを処理する方法はいくつかあります。基本的なアプローチは、シェルの機能を使用して設定されているパラメータをテストすることです。だからあなたは持つことができます

docker run ${ti_arg:+"$ti_arg"} --rm  "test-$commit_id"

これはti_argが設定されているかどうかをテストし、そうであればそれをに入れます"$ti_arg"

もちろん、起動スクリプトはexport ti_arg=''最高ではありません。これは、パラメータ値が空の文字列であることを明示的に意味します。値が設定されていないと言う方が良いでしょうunset ti_arg。ただし、この場合は問題は解決しません。ただし、値が設定されていない状況をよりよく表現するためにを使用できます${ti_arg+"$ti_arg"}(がないことに注意してください)。:

「$@」の使い方

幸いなことに、昔から人々は

subprog ${1:"$@"}

この問題を解決するには、スクリプトでパラメータ拡張を処理してください。 Bourneのすべての最新実装(シェルなど)では、このバグが修正されているので(二重引用符で)単に言うことができ、"$@"値が設定されていない場合は正しくnullに拡張されます。したがって、名前付き変数を使用する代わりに、次のものを使用できます。

set -- # Clear the $@ array
if [[ -t 1 ]] ; then
    set -- "-ti"
fi
...
docker run "$@" --rm  ....

Cプログラマに関する注意事項

おなじみの人のためにC設定されていない変数と空の文字列に設定されるものの違いは次のとおりです。

  1. char *var = NULL; /* unset case. var is 4 or 8 bytes all of which are 0 */
  2. char *var = strdup(""); /* set to the empty string. var is still 4 or 8 8 bytes, but now contains the address of an item in the heap, which could be as small as 1 byte. The first byte of this heap item will be 0, to indicate the end of string */

おすすめ記事