Posted at

シェルスクリプトでデフォルト値の代入

More than 3 years have passed since last update.


概要

if [ "${addr:-X}" = X ]; then

echo "hoge"
fi

みたいにコロン使った場合にどうなるかのお話です。

常識的な話かもしれませんが、自分が知らずかつググりにくかったのでメモしておきます。

ifで比較する場合に、

if ["x$addr" = "x"]; then

echo $addr
fi

のようにするのは知っていたのですが、コロン使った場合は知らなかったので一応メモしておきます。


参考サイト

初心者向け、「上手い」シェルスクリプトの書き方メモ


コロンの使い方

基本的に変数に値がセットされているかどうかの確認のために使われるようです。


- の場合

${addr:-value}

こうすると変数addrが空白であればvalueがその値となるそうです。


+ の場合

${addr:+value}

-とは逆にaddrが空白でない場合にvalueがその値となります。


= の場合

${addr:=value}

変数addrが空白であればvaluenameにセットされます。


? の場合

${addr:?value}

変数addrが空白であればvalueを標準エラー出力に出力し、シェルスクリプトの実行を終了します。


何も付けない場合

${addr:begin}

${addr:begin:end}

変数nameの「begin」バイト目から「end」文字出力します。


おまけ

なんでいちいちxとかつけるのかについて説明します。

if ["x$addr" = "x"]; then

echo $addr
fi

これは変数addrnullだった場合にエラーが出るからです。

if [$addr = ""]; then

ではダブルクォーテーションで囲えばよいのかというと、-fなどの時に怒られるらしいです(自分の環境では怒られませんでした。誰か詳しい人教えてください)。

if ["$addr" = ""]; then

最も安全な記述方法は確実に文字列として評価されるようにすることらしいです。

自分はハマるのめんどくさいのでxつけちゃってます。

if ["x$addr" = "x"]; then

echo $addr
fi