bashで単一のコマンドを使用してシェル変数にデフォルト値を割り当てる


682

私はbash(3.00)シェルスクリプト内の変数に関する一連のテストを行っています。変数が設定されていない場合、デフォルトが割り当てられます。例:

if [ -z "${VARIABLE}" ]; then 
    FOO='default'
else 
    FOO=${VARIABLE}
fi

一行でこれを行うにはいくつかの構文があることを思い出しているようです。たとえば、三項演算子に似ています。

FOO=${ ${VARIABLE} : 'default' }

(私はそれがうまくいかないことを知っていますが...)

私は狂っていますか、それともそのようなものが存在しますか?


1
bashシェルリファレンスのShell Parameter Expansionセクションは、出発点として適しています:tiswww.case.edu/php/chet/bash/bashref.html#Shell-Expansions
Kemin Zhou 2017

1
Shell Parameter Expansionの Gnu.orgドキュメント(ヒント:あなたができる他のクールなことがたくさんあります!)
JDBはMonica

回答:


1225

実際に投稿した内容に非常に近い:

FOO=${VARIABLE:-default}  # If variable not set or null, use default.

それとも、これが割り当てられますdefaultVARIABLEも同様に:

FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.

64
ドキュメントでこれを見つけたい場合、グーグルは何をしますか?$ {:-}のような特殊文字でグーグルするのは簡単ではありません。
Joshua Olson

20
solarmistへの応答:「bash変数割り当てのデフォルト」でこのページに移動し、「変数ass」でbashのマニュアルページを検索すると、〜5つの「next」の後に正しいセクションが表示されます
Mooshu

57
これ bash固有ではなく、シェルファミリ全体で機能することに注意してください。一般的なスクリプトでは安全です。
Jocelyn delalande 14

16
@solarmistキーワードとそのコンパニオンについてもっと知りたい場合は、「bashパラメータの展開」がキーワードです。
duleshi 14

20
これは、トピックunix.stackexchange.com/a/122848/2407の
jottr

288

コマンドライン引数の場合:

VARIABLE=${1:-DEFAULTVALUE}    

VARIABLEスクリプトに渡された最初の引数の値、またはそのDEFAULTVALUEような引数が渡されなかった場合の値に割り当てられます。


243

変数が同じ場合、

: "${VARIABLE:=DEFAULT_VALUE}"

定義されていない場合、DEFAULT_VALUEをVARIABLEに割り当てます。二重引用符は、グロビングと単語分割を防ぎます。

Bashマニュアルのセクション3.5.3、Shell Parameter Expansionも参照してください。


27
このトリッキーなトリックは私には明らかではありませんでした。$ {..}の拡張を食べるために:no-effectビルトインを使用しましたが、VARIABLEセットを残しました。これまで、私はVARIABLE = "$ {VARIABLE:-DEFAULT_VALUE}"を実行しており、VARIABLEを2回使用することについてはおかしく感じていました。
dino、

これは、常にBASH-BUILTIN変数で機能するとは限りません。それは非常に奇妙です。現在私に知られているものはHISTTIMEFORMAT
Otheus

複数のデフォルト値を設定するにはどうすればよいですか?「:$ {VARIABLE:= DEFAULT_VALUE}:$ {VARIABLE2:= DEFAULT_VALUE2}」を試しましたが、うまくいかないようです...
Hans

8
@ハンス:コロンはコマンド(何もしない)であるため、1回だけ必要です。例:: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}
Patrik、

34

デフォルト値のように別の変数の値を使用することもできます

ファイルを持っている defvalue.sh

#!/bin/bash
variable1=$1
variable2=${2:-$variable1}

echo $variable1
echo $variable2

実行./defvalue.sh first-value second-value出力

first-value
second-value

そして実行./defvalue.sh first-value出力

first-value
first-value


25

あなたの質問とすべての変数置換について答えるために

echo "$\{var}"
echo "Substitute the value of var."


echo "$\{var:-word}"
echo "If var is null or unset, word is substituted for var. The value of var does not change."


echo "$\{var:=word}"
echo "If var is null or unset, var is set to the value of word."


echo "$\{var:?message}"
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly."


echo "$\{var:+word}"
echo "If var is set, word is substituted for var. The value of var does not change."

17

FWIW、次のようなエラーメッセージを提供できます。

USERNAME=${1:?"Specify a username"}

次のようなメッセージが表示され、コード1で終了します。

./myscript.sh
./myscript.sh: line 2: 1: Specify a username

すべてのより完全な例:

#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo "$ACTION"
echo "$DIRNAME"
echo "$OUTPUT_DIR"

出力:

$ ./script.sh foo
foo
/path/to/pwd
/tmp

$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
  • $ACTION 最初の引数の値を取り、空の場合は終了します
  • $DIRNAME 2番目の引数で、デフォルトは現在のディレクトリです
  • $OUTPUT_DIR3番目の引数、または$HOMEDIR(定義されている場合)、そうでない場合はです/tmp。これはOS Xで動作しますが、移植性があるとは思いません。

16

次に、if構文をより簡潔に表現する方法があります。

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}

9

ここに例があります

#!/bin/bash

default='default_value'
value=${1:-$default}

echo "value: [$value]"

これをscript.shとして保存し、実行可能にします。パラメータなしで実行する

./script.sh
> value: [default_value]

paramで実行する

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