bashデフォルト値を割り当て


135

$ {parameter:= word}デフォルト値を割り当てます。パラメータが設定されていないかnullの場合、単語の展開がパラメータに割り当てられます。次に、parameterの値が置き換えられます。このように、定位置パラメーターと特殊パラメーターを割り当てることはできません。

longの${LONG_VARIABLE_NAME:=hello}代わりにこの機能を使用して書き込むことができると思いましたがLONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}、bashも 'hello'を実行しようとし、コマンドが見つかりません。それを回避する方法はありますか?それとも私は後者に固執する必要がありますか?誰かがデフォルトの割り当てが実際に役立つ例を挙げられますか?


13
テキストを引用する場合、ソースへのリンクを含めると役立ちます。
Jonathon Reinhart 2015年

回答:


202

コロンを使用:

: ${A:=hello}

コロンは、何もせず、引数を無視するnullコマンドです。これはbashに組み込まれているため、新しいプロセスは作成されません。


93
私はそれ: ${A:=hello}がと同じくらい長いことを観察せざるを得ませんA=${A:-hello}。後者は少し難解ではなく、その意図はより明確であるようにも思われます。:基本的に何もしないを使用することは、OPが以前に行っていた方法と比較すると、ぎこちないように見えます。
Dan Molding

5
@camh:そうだね。デフォルトに初期化する変数がたくさんあり、それらの名前が長い場合は、:入力と読み取りの両方の方法が好ましいでしょう。はい、これはBashが少し改善できる領域のようです。
Dan Molding

17
@DanMoulding:: ${VERY_LONG_VARIABLE_NAME:=hello}vs VERY_LONG_VARIABLE_NAME=${VERY_LONG_VARIABLE_NAME:-hello}. について:コードで説明的な変数名を使用してください:)
pihentagy

18
短いだけでなく、エラーが発生しにくくなりますVERY_LONG_VARIABLE_NAME=${VERY_LOGN_VARIABLE_NAME:-hello}。おっとっと。
chepner 2014

5
このA=$A:-helloアプローチの利点は、で実行すると自己文書化されることset -xです。つまり、割り当ては次のように出力されA=helloますが、nullコマンドは値(hello)のみを出力します。
lmsurprenant

107

例については、http: //www.tldp.org/LDP/abs/html/parameter-substitution.htmlを参照してください

${parameter-default}, ${parameter:-default}

パラメータが設定されていない場合は、デフォルトを使用します。呼び出し後、パラメーターはまだ設定されていません。
どちらの形式もほとんど同じです。エクストラ:は、パラメーターが宣言されているがnullである場合にのみ違いを生じます。

unset EGGS
echo 1 ${EGGS-spam}   # 1 spam
echo 2 ${EGGS:-spam}  # 2 spam

EGGS=
echo 3 ${EGGS-spam}   # 3
echo 4 ${EGGS:-spam}  # 4 spam

EGGS=cheese
echo 5 ${EGGS-spam}   # 5 cheese
echo 6 ${EGGS:-spam}  # 6 cheese

${parameter=default}, ${parameter:=default}

パラメータが設定されていない場合は、パラメータ値をデフォルトに設定します。
どちらの形式もほぼ同等です。:は、パラメータが宣言されていてnullである場合にのみ違いを生じます

# sets variable without needing to reassign
# colons suppress attempting to run the string
unset EGGS
: ${EGGS=spam}
echo 1 $EGGS     # 1 spam
unset EGGS
: ${EGGS:=spam}
echo 2 $EGGS     # 2 spam

EGGS=
: ${EGGS=spam}
echo 3 $EGGS     # 3        (set, but blank -> leaves alone)
EGGS=
: ${EGGS:=spam}
echo 4 $EGGS     # 4 spam

EGGS=cheese
: ${EGGS:=spam}
echo 5 $EGGS     # 5 cheese
EGGS=cheese
: ${EGGS=spam}
echo 6 $EGGS     # 6 cheese

${parameter+alt_value}, ${parameter:+alt_value}

パラメータが設定されている場合はalt_valueを使用し、それ以外の場合はnull文字列を使用します。呼び出し後、パラメーター値は変更されません。
どちらの形式もほぼ同等です。:は、パラメータが宣言されていてnullである場合にのみ違いを生じます

unset EGGS
echo 1 ${EGGS+spam}  # 1
echo 2 ${EGGS:+spam} # 2

EGGS=
echo 3 ${EGGS+spam}  # 3 spam
echo 4 ${EGGS:+spam} # 4

EGGS=cheese
echo 5 ${EGGS+spam}  # 5 spam
echo 6 ${EGGS:+spam} # 6 spam

20

デフォルト値のパラメーター展開は、以下の例のようなビルドスクリプトで役立つことがよくあります。ユーザーがスクリプトをそのまま呼び出す場合、perlは組み込まれません。組み込みにするには、ユーザーは明示的にWITH_PERL「no」以外の値を設定する必要があります。

$ cat defvar.sh
#!/bin/bash

WITH_PERL=${WITH_PERL:-no}

if [[ "$WITH_PERL" != no ]]; then
    echo "building with perl"
    # ./configure --enable=perl
else
    echo "not building with perl"
    # ./configure
fi

Perl なしでビルド

$ ./defvar.sh
not building with perl

ビルドのPerl

$ WITH_PERL=yes ./defvar.sh
building with perl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.