シェルの中かっこ拡張はどのように機能しますか?

シェルの中かっこ拡張はどのように機能しますか?

このコマンドはをecho {1..3}-{1,2}印刷します1-1 1-2 2-1 2-2 3-1 3-2。中かっこがどのように使用されるかを理解します。しかし、実際には何ですか?はいそれらを?

sh/の使命は、bashそれらを解析/拡張し、拡張バージョンをランチャーに渡すことですか?

それでは、他に何ができ、仕様はありますか?

しかも名前もありますか?

ls *.txtインテリアも同様の方法で処理されますか?

n回繰り返される引数を実装する方法はありますか?例えば(もちろん動作しません。単なる概念です):cat test.pdf{*3}cat test.pdf test.pdf test.pdf

答え1

彼らが電話する支柱の拡張

bashこれはzsh、およびによって実行されるいくつかの拡張子のうちの1つでありksh、そのうちのファイル名拡張子*.txtは別のものです。中かっこ拡張は POSIX 標準に含まれないため、移植性はありません。この内容は以下から読むことができます。バッシュマニュアル

@Arrowの提案に従って中括弧拡張のみを使用するには、cat test.pdf test.pdf test.pdf次の「ハッキング」を使用する必要があります。

#cat test.pdf test.pdf
cat test.pdf{,}

#cat test.pdf test.pdf test.pdf
cat test.pdf{,,}

#cat test.pdf test.pdf test.pdf test.pdf
cat test.pdf{,,,}

いくつかの一般的な用途:

for index in {1..10}; do
   echo "$index"
done

touch test_file_{a..e}.txt

または文字列を10回印刷する別の「ハッキング」:

printf -- "mystring\n%0.s" {1..10}

支柱の拡張がbash完了しました。今後パラメータ拡張なので、よく犯される間違いは次のとおりです。

num=10
for index in {1..$num}; do
   echo "$index"
done

ksh93しかし、シェルはこの問題を処理できます)

答え2

ペサの答え答えは質問の重要な側面をカバーしています。いくつか追加したいことがあります。

アスタリスクはls *.txtシェルによって処理されるため、シェル組み込み機能で変更できるシェルオプションによって制御されます。この場合、を実行してアスタリスク拡張を無効にし、を実行してset -f再度有効にすることができますset +f

もう一つのことは、スクリプトを移植可能にしたい人は誰でもPOSIX標準をチェックする必要があるということです。たとえば、{1..9..2}4に拡張されますが、1 3 5 7 9サブbashバージョンbashsh

関連情報