2010-12-14 10 views
82

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

私が代わりにLONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}長いの${LONG_VARIABLE_NAME:=hello}を書くためにこの機能を使用することができると思ったが、今bashはまた、「ハロー」を実行しようとすると、それが見つからない指令を与えます。それを避ける方法はありますか?それとも、私は後者に固執する必要がありますか?誰かが割り当てのデフォルトが実際に有用である例を与えることができますか?

+10

テキストを引用するときは、ソースへのリンクを含めると便利です。 –

答えて

137

は、コロンを使用します。

: ${A:=hello} 

コロンは何もしないとその引数を無視し、ヌルコマンドです。これはbashに組み込まれているので、新しいプロセスは作成されません。

+58

'$ {A:= hello}'は 'A = $ {A:-hello}'とまったく同じです。後者はあまりにも難解であり、その意図はより明確であると思われる。基本的にはノーオペレーションである ':'を使うと、OPがこれまでやっていたやり方と比べてクルージングに見えます。 –

+0

@DanMoulding:どちらの解決策も満足できるものだとは思わない。私は2番目のフォームの途切れが気に入らないので、スクリプトの開始時にデフォルトを設定するために ':'行を少し優先します。 (また、1文字の変数名には同じ長さしかありません)。 – camh

+2

@camh:同意しました。デフォルトに初期化するための変数がたくさんあり、名前が長い場合は、入力と読み込みの両方で ':'アプローチが優先されます。はい、これはBashが少し改良を加えることができるエリアのようです。 –

14

デフォルト値のパラメータ拡張は、以下の例のようなビルドスクリプトで役立ちます。ユーザーがjust-あるとして、Perlはに建設されることはありません。ユーザーは、それが組み込まれていために「いいえ」以外の値にWITH_PERLを明示的に設定する必要があり、スクリプトを呼び出す場合。

$ 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 
+0

あなたの答えに感謝します。 – zedoo

31

をご覧くださいの場合

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

パラメータが設定されていない場合は、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} 

パラメータがデフォルトに、設定されたパラメータ値を設定していない場合。
どちらのフォームもほぼ同等です。 :他のパラメータセット、使用alt_valueは、ヌル文字列を使用する場合は、パラメータを宣言し、

# 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} 

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 
+2

これは非常に明確ではありませんが、残念ながら:( –

関連する問題