~からzsh ドキュメント:
${名前 - 単語}
${名前:-単語}
名前が設定されている場合、または2番目の形式で空でない場合はその値が置き換えられ、それ以外の場合は単語が置き換えられます。 2番目の形式では名前を省略できます。この場合は常に単語に置き換えられます。
したがって、次のようなものを使用できます。
$ printf '%s\n' ${:-123}
123
zsh
これが許可されている理由とどのような状況で役に立つかを知りたいです。
答え1
説明がありません。なぜこれを行いますが、${:-foo...}
アプリケーションがあります。構文上、必要に応じてパラメータ置換と見なされますが、常にユーザーが提供するリテラルに拡張されます。このようなものを作成して使用することができます拡張フラグまたはその他の拡張指定子内部リテラル文字列から:
$ echo ${(#)${=${:-65 66 67}}}
A B C
$ echo ${(q)${:-hello world!}}
hello\ world\!
あなたもできますword
文字列に異なる拡張子を使用する:
$ restofarglist=arg3,arg4
$ echo ${${:-arg1,arg2,$restofarglist}//,/ }
これらの操作はすべて正しく記録されます。パラメータ拡張セクションの最後に:
${...}
代わりに型パラメータ式を使用する$(...)
場合、または型コマンド置換を使用する場合名前上記では、最初に拡張し、結果をまるで拡張したかのように使用します。名前。
これらの拡張は必要に応じて深く入れ子にすることができますが、すぐに理解するのは難しくなります。${name=word}
両側で大家族を使用すると、奇妙なケースが発生する可能性があります。
通常、これはタスクを実行するためのやや鈍感な方法ですが、私が知っている唯一のアプリケーションであり、他の変数を作成せずに${:-}
これらのタスクを実行する唯一の方法です。技術的にはすべてがすでに存在していますが、文書は確かにより明確になります。
答え2
パラメータ拡張の他の機能と組み合わせることで、いくつかのきちんとしたトリックを実行できます。
いくつかの例:
# strftime date via prompt sequences
tar -cpf ${(%):-%D{%Y%m%d}}-/etc.tar /etc
# brace expansion, but separated by commas via PE flags and nesting PEs.
print ${(j:,:)${:-{1..10}}}