| author | プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com> | ||
|---|---|---|---|
| created | 2026-07-25 | ||
| draft | true | ||
| tags |
|
||
| title | Bash 中括弧展開ノート |
中括弧展開を使って、始まりや終わりが同じであるが、相異なる文字列を書き出すことができる。
$ cp hello.txt hello.txt.bak
$ cp hello.txt{,.bak}preamble{csv}postscript
preamble{sequence-expr}postscriptここで preamble および postscript は空文字列を含む任意の文字列であり、csv は , で区切られた任意の文字列を並べた文字列とする。
例:
$ touch {README,INSTALL}.md
$ mkdir -p workspace/{bin,lib,src,obj}sequence-expr は .. を用いた表現で、次のどちらか:
first..last
first..last..incrここで first および last はそれぞれ文字または整数とする。
例:
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
$ echo {1..10..2}
1 3 5 7 9
$ echo {10..1..-1}
10 9 8 7 6 5 4 3 2 1
$ echo {10..1..-2}
10 8 6 4 2- 中括弧展開は左から右へ作用する
- 中括弧展開は入れ子にすることが可能
- 中括弧展開の結果は
csv部分の並び方を考慮する(勝手にソートすることはない) - 中括弧展開の優先度はきわめて高く、他の展開では特別文字である文字の特殊性が失せる
- 中括弧展開され損なったパターンは全体としてリテラル文字列のように扱われる
- 当たり前だが、
${...}は中括弧展開ではなく単なる変数展開として扱われる sequence-expr方式において、C locale が用いられるsequence-expr方式において、incrを明示しない場合、firstとlastの大小関係から1か-1に決まる
組み込みコマンド set の B フラグで中括弧展開機能の有無を切り替えることが可能だ。
set +o braceexpandと同じ- 既定では
set -Bであり、中括弧展開は有効だ。 - 中括弧展開は古の
shとの互換性を若干損なうので、場合によってはset +Bする必要があるかもしれない。
ターミナルで M-{ を打鍵すると、Bash は現在のディレクトリーにあるファイル名の補完を実行し、候補一覧を {} で囲んでコマンド行に出力する。
例えばこんなディレクトリーにいるとして:
$ ls
bash-brace-expansion.md fzf-cases.md using-bat.md
bash-filename-expansion.md fzf-git.md using-eza.md
bash-history-expansion.md gimp3.md using-fzf.md
bash-history-options.md obs-studio-note.md windows-11-note-1.md
bash-history-variables.md packages-outside-winget.txt windows-11-note-2.md
bash-parameter-expansion.md packages.json windows-11-note-3.md
bash-quoting.md peekui.md windows10.mdusing- まで打鍵して Alt+Shift+[ を押すと、コマンド行が次のように変化する:
$ using-{bat.md,eza.md,fzf.md}もちろんこのような場合は中括弧式を手動で打鍵するのが早いが、状況によっては有用なのだろう。
以上