私は次を読んだZシェルユーザーガイド:
「true」の同義語は「:」です。この形式では副作用がありますが、使用しないパラメータを提供するためによく使用されます。
: ${param:=value}
これは、すべてのBourneシェル派生物で共通に使用される慣用語です。パラメータ拡張では、
$param
以前に空であった場合はvalue値が与えられ、それ以外の場合は処理されません。これがパラメータ拡張の唯一の理由なので、通常:
このパラメータを無視します。実際、シェルはコマンドラインを簡単に設定し($param
割り当てるかどうかにかかわらず、コロンの後にis値が入る)コマンドを実行します。 ':' は与えられた引数を認識しません。
しかし、理解できません。わかりました:
。true
しかし、式には2つのコロンがあります。小さな質問で、すべてのBourneシェル派生物でこのイディオムがなぜそんなに使われていますか?その目的は何ですか?
メモ: 私はこのイディオムが両方の役割を果たしていることに興味があります。強く打つそして扱いにくい。
ありがとう
答え1
いろいろな部分に分けてみましょう。
このコードはいくつかのパラメータを使用してコマンドを実行します:
。このコマンドは:
何も実行せず、その引数を無視します。したがって、コマンドライン全体は、パラメータで発生する副作用以外には何もしません。
この構文は、${parameter_name:=value}
ash、bash、ksh、zsh など、すべての非アンティークの Bourne スタイルのシェルに存在します。必要に応じてパラメータをデフォルト値に設定します。それは等しい
if [ -z "$parameter_name" ]; then parameter_name=value; fi
… ${parameter_name}
つまり、parameter_name
設定されていない場合、またはnull値に設定されている場合は、表示された値に設定され、新しいパラメータ値でコマンドが実行されます。${parameter_name=value}
引数が空の場合は空白のままになり、引数が設定されていない場合は表示された値のみを使用するバリアントがあります。
この構文は「パラメータ拡張」に文書化されています。POSIX仕様、およびdash、bash、ksh、およびzshのマニュアルを参照してください。
この構文にはいくつかのバリエーションがあり、特に${parameter_name:-value}
パラメータに割り当てることなく、この拡張のデフォルト値を使用できます。
要約すると: ${parameter_name:=value}
簡潔な書き込み方式だ。
if [ -z "$parameter_name" ]; then parameter_name=value; fi
答え2
:
事実を意味しません。と思うかもしれませんが、while :
その表現でも「true」を意味せずに偶然に評価するだけです(実際には空のコマンドであるかnoopにすぎません)。
パラメータ拡張(${x:=y}
)は「割り当て」を意味します。ワイ到着XもしX設定されていないか空で、最終値を拡張します。X」。
$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar
Bash Hackers wikiにはパラメータ拡張に関する良い記事があります。ここ。
使用する理由:
は、コマンドの他の部分が評価されても実行されないためです(:
空のコマンドと同様)。これにより、${x:=y}
他に影響を与えずにすでにその機能を実行しています。たとえば、最初にそうでない場合は、次:
の機能を実行しようとします。ワイ。
bash
ヘルプページは次のとおりです:
。
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
答え3
1つ目:
は「noop」または「no Operation」というコマンドです。マンページに記載されているように、通常はパラメータを評価するために使用されます。
2番目:
は変数拡張の修飾子です。これは技術的に本当です:=
。前述のように、値がない場合は値が設定されます。
慣用的な観点から見ると、環境変数のデフォルト値が必要な場合は、この構文を使用できます。たとえば、を通じてプログラムを実行すると、cron(8)
環境は設定されず、シェルのドットファイルは実行されません。したがって、いくつかのデフォルト値を設定する必要があるかもしれません。
: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}
その後、「設定して忘れる」ことができます(デフォルトのjvmが変更されるまで)。