GNU/Linux >> Linux の 問題 >  >> Linux

スクリプトでの変数代入に「${a:-b}」を使用しますか?

私は他の人が書いたいくつかのスクリプト(特にRed Hat)を見てきましたが、それらの変数の多くは次の表記法を使用して割り当てられています
VARIABLE1="${VARIABLE1:-some_val}">
または他の変数を拡張する
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"

値を直接宣言するのではなく、この表記を使用する意味は何ですか(例:VARIABLE1=some_val )?

この表記法には利点がありますか、それとも防止できる可能性のあるエラーはありますか?

:- この文脈で特定の意味がありますか?

承認された回答:

この手法では、別の変数が空であるか未定義の場合に、変数に値を割り当てることができます。 注: この「他の変数」は、同じ変数でも別の変数でもかまいません。

抜粋

${parameter:-word}
    If parameter is unset or null, the expansion of word is substituted. 
    Otherwise, the value of parameter is substituted.

注: このフォームも機能します。${parameter-word} 。 Bash内で利用可能なすべての形式のパラメーター拡張の完全なリストを確認したい場合は、BashHackerのwikiの「パラメーター拡張」というタイトルのこのトピックを参照することを強くお勧めします。

変数は存在しません

$ echo "$VAR1"

$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
default value

変数が存在します

$ VAR1="has value"
$ echo "$VAR1"
has value

$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
has value

同じことは、他の変数を評価するか、表記のデフォルト値の部分でコマンドを実行することによって行うことができます。

$ VAR2="has another value"
$ echo "$VAR2"
has another value
$ echo "$VAR1"

$

$ VAR1="${VAR1:-$VAR2}"
$ echo "$VAR1"
has another value

その他の例

VARX=${VARX-<def. value>}

$ echo "${VAR1-0}"
has another value
$ echo "${VAR2-0}"
has another value
$ echo "${VAR3-0}"
0

上記の$VAR1$VAR2 文字列「hasanothervalue」ですでに定義されていますが、$VAR3 は未定義だったため、代わりにデフォルト値が使用されました 。

別の例

$ VARX="${VAR3-0}"
$ echo "$VARX"
0

:=を使用した確認と割り当て 表記

最後に、便利な演算子:=について説明します。 。これにより、テスト対象の変数が空または未定義の場合にチェックが行われ、値が割り当てられます。

$VAR1に注意してください これで設定されました。演算子:= 1回の操作でテストと割り当てを行いました。

$ unset VAR1
$ echo "$VAR1"

$ echo "${VAR1:=default}"
default
$ echo "$VAR1"
default

ただし、値が前に設定されている場合は、そのままになります。

$ VAR1="some value"
$ echo "${VAR1:=default}"
some value
$ echo "$VAR1"
some value

便利なダンディリファレンステーブル

関連:文字列をttyに入れてコマンドを作成しますか?

参考資料

  • パラメータ拡張– Bash Hackers Wiki
  • 10.2。パラメータの置換
  • バッシュパラメータの拡張

Linux
  1. Java が 'localhost:10.0' を DISPLAY 変数の値として使用して X11 ウィンドウ サーバーに接続できない

  2. 列値条件で awk を使用する

  3. スクリプト内の bash シェル スクリプトおよび関数の変数スコープ

  1. Linuxパッケージ管理のためのAppImageの使用

  2. systemd サービスの ExecStart のコマンド パスで変数を使用する

  3. KVM ゲストに virtio を使用していますか?

  1. 自動化のためのBashの使用

  2. Bashスクリプトに.shまたは.bash拡張子を使用しますか?

  3. BashスクリプトでのLinuxスリープコマンドの使用