シェルにおける「:-」の使い方と利点

シェルにおける「:-」の使い方と利点

korn シェルスクリプトで次の行が見つかりました。

var=${var:-/temp}

何をしているのかわかりました。

$ var=/data
$ var=${var:-/temp}
$ echo $var
/data
$ var=
$ echo $var

$ var=${var:-/temp}
$ echo $var
/temp

値を確認して割り当てるよりも利点はありますか?

答え1

2つのコマンド(例[[ -z $var ]] && var=/temp:)または複雑なコマンド(例:

if [[ -z $var ]]
then
    var=/temp
fi

さらに、変数に条件付き値を割り当てる必要もありません。例えば、

#!/bin/sh
prog="$1"
# Do sanity checks & input validation here.
cc "$prog" -o "${2:-$(basename "$prog")}"

呼び出されると、コンパイルされた出力をcomp foo.cコンパイルして作成します。ただし、コンパイルされた出力をコンパイルして作成します。foo.cfoocomp foo.c fufoo.cfu

これは、デフォルト値で複数のパラメータを使用する場合に特に重要です。

いくつかのコマンド${1:-デフォルト値1${2:-デフォルト値2${3:-デフォルト値3${4:-デフォルト値4${5:-デフォルト値5} ${6:-デフォルト6${7:-デフォルト値7${8:-デフォルト値8${9:-デフォルト値9}

逆に、パラメータを設定するには約18のコマンドが必要です。

変数に条件付き値を割り当てることなくこの機能を使用する方法の別の例は、ユーザーがファイルを編集できるようにするスクリプトです。

#!/bin/sh
ファイル=
"$(編集者:-vi}" "$file"

ユーザーが好むエディタ(EDITOR環境変数で指定)を呼び出すか、viユーザーがエディタを指定していない場合に呼び出します。

答え2

3つのケースがあります。var最初に設定されていない、空である、空でない可能性があります。最初の 2 つの場合は に設定され/temp、最後の場合はそのまま保持されます。

同じタスクを実行する別の方法は次のとおりです。

: "${var:=/temp}"

クエストチェーンがより明確なので、私はそれを好むが審美的な問題です。

一般設定では次のようになります。

if [ -z "$var" ]; then var="/temp"; fi

これはより明確になるかもしれません。ただし、構文${var:-…}または${var:=…}には利点があります。設定されていない場合でも機能し、エラーが発生する可能性set -uがあります。特定の条件下で変数名を誤って入力したり、変数定義を忘れたりすることで発生するエラーを簡単に見つけることができるという利点があります。ただし、設定されていない変数を常に拡張できると仮定しないスクリプトでのみ使用できます。$varvarset -u

答え3

それ簡潔なイディオム。あなたはそれを使用することができます待ち行列コマンドを実行する場所:

cmd "${arg1}" "${arg2}" "${arg3:-42}"

またはプログラムの先頭から(または関数の最初のステートメントに)パラメータインタフェースの主張:コマンドを使用):

: "${1:?} ${2:?}"

または、プログラムまたはその操作で操作される意味的に名前付き変数にそれらを確認して割り当てます。機能:

foo=${1:?} bar=${2:?} baz=${3:-42}

最初の2つのパラメータ(この場合)が必須の場合、3番目のパラメータは指定されていない場合はデフォルト(上記の「42」)です。

関連項目が位置パラメーターではなく変数である場合は、関連構文${var:=val}(または関連)を使用してこれを達成することもできます。${var=val}

: "${foo:=${1:?}} ${bar:=${2:?}} ${baz:=${3:-42}}"

この慣用語の${var:-42}変形もあります${var-42}(つまり、:コロンなし)。区別する 未設定パラメータは以下から来ます。パラメータはtestコンストラクタを直接区別できません。変数は以下から来ます。未設定変わりやすい。

答え4

「過剰確認」ではなく「デフォルト設定」です。つまり、値が設定されていない(または空の場合)デフォルト値が使用されます。

関連情報