新しい定義が空でない場合は、変数をオーバーライドしてください。

新しい定義が空でない場合は、変数をオーバーライドしてください。

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

master="master";
integration="integration";

if [ -f '.vcs.json' ]; then
    master=`read_json -f .vcs.json -k git.master`
    integration=`read_json -f .vcs.json -k git.integration`
fi

しかし、read_jsonの結果が空でない場合にのみ、デフォルト/統合変数をオーバーライドしたいと思います。

私は次のことを考えています:

master="master";
integration="integration";

if [ -f '.vcs.json' ]; then
    master="${`read_json -f .vcs.json -k git.master`:-master}"
    integration="${`read_json -f .vcs.json -k git.integration`:-integration}"
fi

しかし、構文が正しいかどうかはわかりません。

答え1

文字列が空でない場合にのみ操作を実行するには、変数を参照するときにパラメータのデフォルト値を使用してください。

master="$(read_json -f .vcs.json -k git.master)"

サブシェルコマンドが出力を返さない場合、変数はnullになります。その後、基本的な交換でこれを利用できます。

do-a-thing "${master-master}" # if 'master' is null, use the default value 'master'
                              # otherwise, use the contents of the variable

答え2

ロジックを裏返します。

# Note that the variables 'master' and 'integration' are NOT defined yet
if [ -f '.vcs.json' ]; then
  master="${`read_json -f .vcs.json -k git.master`:-master}"
  integration="${`read_json -f .vcs.json -k git.integration`:-integration}"
fi
# Set default values if empty or missing
: ${master:=master} ${integration:=integration}
# They are now guaranteed to be non-empty
echo $master $integration

関連情報