If-else パラメータの置換

If-else パラメータの置換

私はbashを使用して一連の実験を実行しており、実験構成に応じた名前のディレクトリにログファイルを保存したいと思います。構成の一部の項目はブール値(true / false)です。次の構成を例にします。

batch_size=16
fp16=false
bf16=true
checkpoint_activations=true

上記で設定した実験ログファイルを次の名前のディレクトリに入力として保存したいと思います。

output_dir="experiment_bs${batch_size}_dt${fp16 if fp16=true else bf16}_${cp if checkpoint_activations=true else empty}"

もちろん、補助変数を宣言することもできます。

data_type=""
"${fp16}" && data_type=fp16
"${bf16}" && data_type=bf16
"${cp}" && cp="_cp" || cp=""
output_dir="experiment_bs${batch_size}_dt${data_type}${cp}"

しかし、これはちょっと愚かで希望的なものだと思います。パラメータの置換ここで役に立ちます。"${bf16:+bf16}"私の場合は役に立ちません。定義されるたびに、ブール値に関係なく常に "bf16"を印刷するためです。

このユースケースに適用できるパラメータ置換はありますか?それともこの問題に対するより良いオンラインソリューションはありますか?

data_type注:自分の設定で直接使用しない理由はアプリケーション固有の理由です。

ベストアンサー1

必要なbashコマンドを入れることができるので、次$(...)のように書くことができます。

output_dir="experiment_bs${batch_size}_dt$([[ $fp16 = true ]] && echo $fp16 || echo $bf16)_$([[ $checkpoint_activation = true ]] && echo $cp || echo empty)"

読みやすくするために、次のように書くこともできます。

printf -v output_dir "experiment_bs%s_dt%s_%s" \
  "$batch_size" \
  "$([[ $fp16 = true ]] && echo "$fp16" || echo "$bf16")" \
  "$([[ $checkpoint_activation = true ]] && echo "$cp" || echo empty)"

サンプル入力を考えると...

batch_size=16
fp16=false
bf16=true
checkpoint_activations=true

...上記の両方が値を生成します。

experiment_bs16_dttrue_empty

おすすめ記事