:$ {param:= value}はどういう意味ですか?


34

Z-Shellのユーザーガイドで以下を読みました。

「true」の同義語は「:」です。この形式では、副作用はあるが使用すべきではない引数を与えるためによく使用されます。

: ${param:=value}

これは、すべてのボーンシェルデリバティブの一般的なイディオムです。パラメータ展開で$paramは、以前に空だった場合は値valueが与えられ、それ以外の場合はそのままになります。それがパラメータ拡張の唯一の理由であるため:、引数を無視するために使用します。実際には、シェルはコマンドラインを簡潔に構築します-コロン、その後に値が何であれ$param、割り当てが行われたかどうかに関係なく-その後、コマンドを実行します。':'が与えられた引数に気付かないのは偶然です。

しかし、私はそれを理解していません。という:意味trueですが、式には2つのコロンがあります。小さな質問として、なぜこのイディオムがすべてのBourneシェル派生物でそんなに使われているのですか?どんな目的に役立ちますか?

注: このイディオムがbashzshの両方で行うことに興味があります。

ありがとう


を求めていますzshbash
enzotib

@enzotib、私は両方に興味があります。それを明確にした。
アメリオバスケスレイナ

回答:


31

これを細かく分けましょう。

このコードは、:いくつかの引数を指定してコマンドを実行します。コマンド:は何もせず、引数を無視します。したがって、引数で発生する副作用を除いて、コマンドライン全体は何もしません。

構文${parameter_name:=value}は、ash、bash、ksh、zshなど、すべての非アンティークBourneスタイルのシェルに存在します。必要に応じて、パラメーターをデフォルトに設定します。それは同等です

if [ -z "$parameter_name" ]; then parameter_name=value; fi
 ${parameter_name}

つまり、parameter_nameが設定されていないか、空の値に設定されている場合は、指定された値に設定します。次に、新しいパラメーター値を使用してコマンドを実行します。バリアントがあります。これは${parameter_name=value}、パラメーターが設定されていない場合に示された値のみを使用して、パラメーターが空の場合は空のままにします。

この構文は、POSIX仕様の「パラメータ展開」、およびダッシュ、バッシュ、ksh、zshのマニュアルに記載されています。

この構文にはさまざまなバリエーションがあり、特に${parameter_name:-value}、パラメーターに割り当てずに、この展開に対してのみデフォルト値を使用できます。

要約する: ${parameter_name:=value}と、簡潔な書き方です

if [ -z "$parameter_name" ]; then parameter_name=value; fi

11

:あなたはおそらく考えているのですwhile :が、その表現でも「true」を意味するのではなく、単に評価されます(実際には、単にnullコマンド、つまりnoopです)。

このパラメータの拡張は(${x:=y}「アサイン)を意味し、YXを場合Xが設定されていないまたは空の、及びに拡張Y」。

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

バッシュハッカーのwikiは、パラメータ展開に良い記事があり、ここを

:使用される理由は、コマンドの他の部分が評価されている間、それらが実行されないようにするためです(:nullコマンドのように)。したがって、${x:=y}他に何も影響を与えずにその機能を実行しました。たとえば、:最初に持っていなければ、yというコマンドを実行しようとします。

ここにあるbashのヘルプページには、上:

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

3

最初:はコマンドで、「noop」または「no operation」と呼ばれます。マンページで述べたように、引数の評価によく使用されます。

2番目:は変数展開の修飾子です-技術的にはそうです:=。前述のとおり、これは値がない場合に値を設定します。

イディオムに関しては、環境変数のデフォルト値が必要な場合、この構文を使用できます。たとえば、でプログラムを実行する場合cron(8)、環境は設定されず、シェルのドットファイルは実行されません。そのため、デフォルトを設定する必要がある場合があります。

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

次に、「デフォルトのjvmが変更されるまで」「設定して忘れる」ことができます。

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