スクリプトでの変数の割り当てに“ $ {a:-b} ”を使用する

他の人が書いたいくつかのスクリプト(具体的にはRed Hat)を見てきましたが、それらの変数の多くは、次の表記VARIABLE1="${VARIABLE1:-some_val}"を使用して割り当てられています。変数VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"

値を直接宣言するのではなく、この表記を使用する意味は何ですか(例:VARIABLE1=some_val )?

この表記には利点がありますか、または防止される可能性のあるエラーはありますか?

:-は、このコンテキストで特定の意味を持っていますか? ?

コメント

  • man bashをご覧ください。ブロック”パラメータ拡張”を検索します(約28%)。これらの割り当ては、例えばです。デフォルトの機能:”まだ何も設定されていない場合にのみデフォルト値を使用します。”
  • As :-はデフォルト値を設定し、変数が次の場合、:+を使用して値を変更します。 nullではありません。例えば。 v=option; cmd ${v:+ with $v}オプションを指定して” cmdを実行します “。ただし、$ vがnullの場合、実行されるのは” cmd “のみです。

回答

この手法では、別の変数が空であるか未定義の場合に、変数に値を割り当てることができます。 注:この「その他の変数」は同じ変数でも別の変数でもかまいません。

抜粋

${parameter:-word} If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted. 

注:これフォームも機能します、${parameter-word}。 Bash内で利用可能なすべての形式のパラメーター拡張の完全なリストを確認したい場合は、BashHackerのwikiの「パラメータ展開 “。

変数が存在しません

$ echo "$VAR1" $ VAR1="${VAR1:-default value}" $ echo "$VAR1" default value 

変数存在する

$ VAR1="has value" $ echo "$VAR1" has value $ VAR1="${VAR1:-default value}" $ echo "$VAR1" has value 

他の変数を評価するか、表記のデフォルト値の部分でコマンドを実行することで、同じことができます。

$ VAR2="has another value" $ echo "$VAR2" has another value $ echo "$VAR1" $ $ VAR1="${VAR1:-$VAR2}" $ echo "$VAR1" has another value 

その他の例

VARX=${VARX-<def. value>}だけの場合は少し異なる表記を使用することもできます。

$ echo "${VAR1-0}" has another value $ echo "${VAR2-0}" has another value $ echo "${VAR3-0}" 0 

上記の$VAR1 & $VAR2はすでに「hasanother value」という文字列で定義されていますが、$VAR3が定義されていないため、代わりにデフォルト値0

別の例

$ VARX="${VAR3-0}" $ echo "$VARX" 0 

:=表記を使用した確認と割り当て

最後に、便利な演算子:=。これにより、テスト対象の変数が空または未定義の場合にチェックが行われ、値が割り当てられます。

$VAR1が現在セットする。オペレーター:=は1回の操作でテストと割り当てを行いました。

$ unset VAR1 $ echo "$VAR1" $ echo "${VAR1:=default}" default $ echo "$VAR1" default 

ただし、値が設定されている場合以前は、そのままにしておきます。

$ VAR1="some value" $ echo "${VAR1:=default}" some value $ echo "$VAR1" some value 

便利なダンディ参照テーブル

        テーブルのss

参照

コメント

  • これらのすべてが拡張であるとは限らないことに注意してくださいbash。Qの${var:-word}は、上記の${var-word}ではありません。POSIXドキュメントには素晴らしい表がありますが、それをコピーする価値があるかもしれません答えです- pubs.opengroup.org/onlinepubs/9699919799/utilities/ …
  • @Graeme、文書化されています。設定されていないパラメータに対してのみテストでコロンの結果を省略することに注意する必要があります。
  • は、実際にechoが必要な場合に最適です。ただし、’ tを使用しない場合は、組み込みの:を試してください… : ${FOO:=default} $FOOは上記のようにdefaultに設定されています(つまり、まだ設定されていない場合)。しかし、’プロセスで$FOOのエコーはありません。
  • わかりました、答えが見つかりました: stackoverflow。com / q / 24405606/1172302 ${4:-$VAR}を使用すると機能します。
  • 詳細な回答のためだけに+1します。しかし、あなたが優れたbashwikiを参照しているという事実もあります。また、例と表を示しているという事実もあります。地獄、ずっと+1だけです:)私に関しては、構文はほぼ正しいのですが、完全ではありませんでした-‘ manページを検索するのに十分気にしませんでした(難しくはありませんしかし、’見出しが何であったか思い出せず、’今朝4時から起きていました:()..

回答

@slmにはすでに POSIXドキュメントが含まれています-これは非常に役立ちます-しかし、これらのパラメータを組み合わせて相互に影響を与える方法については実際には拡張されていません。この形式については、ここではまだ言及されていません:

${var?if unset parent shell dies and this message is output to stderr} 

これは私の別の回答からの抜粋であり、これらがどのように機能するかを非常によく示していると思います。

 sh <<-\CMD _input_fn() { set -- "$@" #redundant echo ${*?WHERES MY DATA?} #echo is not necessary though shift #sure hope we have more than $1 parameter : ${*?WHERES MY DATA?} #: do nothing, gracefully } _input_fn heres some stuff _input_fn one #here # shell dies - third try doesnt run _input_fn you there? # END CMD heres some stuff one sh: line :5 *: WHERES MY DATA? 

同じの別の例:

 sh <<-\CMD N= #N is NULL _test=$N #_test is also NULL and v="something you would rather do without" ( #this subshell dies echo "v is ${v+set}: and its value is ${v:+not NULL}" echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}" ${_test:+${N:?so you test for it with a little nesting}} echo "sure wish we could do some other things" ) ( #this subshell does some other things unset v #to ensure it is definitely unset echo "But here v is ${v-unset}: ${v:+you certainly wont see this}" echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}" ${_test:+${N:?is never substituted}} echo "so now we can do some other things" ) #and even though we set _test and unset v in the subshell echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}" # END CMD v is set: and its value is not NULL So this $_test:= will equal something you would rather do without sh: line 7: N: so you test for it with a little nesting But here v is unset: So this $_test:= will equal NULL so now we can do some other things _test is still NULL and v is still something you would rather do without 

上記の例では、4つの形式のPOSIXパラメーター置換すべてを利用しています。およびそれらのさまざまな :colon null または not null テスト。上記のリンクに詳細があり、ここに再びあります

${parameter:+expansion}についてよく考えられないもう1つの点は、ヒアドキュメントで非常に役立つことです。${parameter:+expansion}からの別の抜粋です。 div id = “26afc1f026”>

別の答え:

TOP

ここでは、いくつかのデフォルトを設定し、呼び出されたときにそれらを印刷する準備をします…

#!/bin/sh _top_of_script_pr() ( IFS="$nl" ; set -f #only split at newlines and don"t expand paths printf %s\\n ${strings} ) 3<<-TEMPLATES ${nl= } ${PLACE:="your mother"s house"} ${EVENT:="the unspeakable."} ${ACTION:="heroin"} ${RESULT:="succeed."} ${strings:=" I went to ${PLACE} and saw ${EVENT} If you do ${ACTION} you will ${RESULT} "} #END TEMPLATES 

MIDDLE

ここで、結果に基づいて印刷関数を呼び出す他の関数を定義します…

 EVENT="Disney on Ice." _more_important_function() { #...some logic... [ $((1+one)) -ne 2 ] && ACTION="remedial mathematics" _top_of_script_pr } _less_important_function() { #...more logic... one=2 : "${ACTION:="calligraphy"}" _top_of_script_pr } 

BOTTOM

これですべての設定が完了したので、ここで実行して結果を取得します。

 _less_important_function : "${PLACE:="the cemetery"}" _more_important_function : "${RESULT:="regret it."}" _less_important_function 

結果

理由についてはすぐに説明しますが、上記を実行すると次の結果が得られます。

_less_important_function()"s 初回実行:

お母さんの家に行って、 Disney onIceを見ました。

書道をすれば成功します。

th ja _more_important_function():

墓地に行きましたそしてディズニーオンアイスを見ました。

矯正数学を行うと成功します。

_less_important_function() もう一度:

墓地に行って、ディズニー・オン・アイスを見ました。

補修数学を行うと、後悔します。

仕組み:

ここでの重要な機能は、 conditional ${parameter} expansion. の概念です。変数を次のように設定できます。次の形式を使用して設定されていないかnullの場合にのみ値:

${var_name := desired_value}

代わりに未設定の変数のみを設定する場合は、 およびnull値はそのまま残ります。

範囲内:

上記の例では $PLACE $RESULT は、 parameter expansion _top_of_script_pr() はすでに呼び出されていますが、おそらく実行時に設定されます。これが機能する理由は、 _top_of_script_pr() ( subshelled ) 関数であるためです-私は同封しました他のユーザーに使用される { curly braces } ではなく、 parens にあります。サブシェルで呼び出されるため、設定するすべての変数は locally scoped であり、親シェルに戻ると、これらの値は表示されなくなります。

しかし、 _more_important_function() $ACTION を設定すると globally scoped なので、 _less_important_function()"s の2回目の評価 $ACTION _less_important_function() $ACTION 経由でのみ設定するためem> ${parameter:=expansion}.

コメント

  • 省略形のデフォルト値が機能することを確認してくださいBourneShellで

回答

個人的な経験。

スクリプトでこの形式を使用して、値のアドホックオーバーライドを実行することがあります。持っている場合:

$ cat script.sh SOMETHING="${SOMETHING:-something}"; echo "$SOMETHING"; 

実行できます:

$ env SOMETHING="something other than the default value" ./script.sh` 

変更せずに SOMETHINGの元のデフォルト値。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です