Xeebi

home categories feeds

Bash の curly bracket とかについて

スコットランドの独立は否決されそうですね.朝から開票結果が気になってだいたいべったり睨んでたので何も手につきませんでした.

さて,時々どこかの blog とかで見る次のようなカッコいいやつ:

mv myfile{.JPG,.jpg}

このあたりについての覚書.Advanced Bash-Scripting Guide1 というとんでもないものがあって, それの Chapter 3 あたりからお届けします.

{xxx,yyy,zzz...}

これは Brace expansion というもので,上の例で使われたのもこれだ. こういう使い方になる2

echo \"{These,words,are,quoted}\"
# => "These" "words" "are" "quoted"

ふむふむ.この expand するってのがどうしっくり理解できてないところがあって, つい ruby の .each とかそういう雰囲気で見てしまいがち. 多分展開したのがそのまま書かれてるつもりで見ればいいんだろうな.

cat {file0,file1,file2} > combined_file

これは cat f0 f1 f2 > cf と等価,と見てよさげ(?). Guide には shell がこの brace expansion をして,コマンドはその結果にかかるという感じのことが書かれている.

ほんでまあカッコいい例

cp myfile.{txt,backup}
# copies "myfile.txt" to "myfile.backup"

スペースなどは escape しないといけないらしい.

{a..z}

Extended Brace expansion3. こう

echo {a..z} # a b c d e f g h i j k l m n o p q r s t u v w x y z

こういうのはこうなるようだ

echo {a..c} {2..4} # a b c 2 3 4
echo {a..c}{2..4} # a2 a3 a4 b2 b3 b4 c2 c3 c4

2つの違いには何かで嵌りそう.くわばらくわばら.

因みに,step 指定したい場合はこう

echo {a..z..2}
# a c e g i k m o q s u w y

負の場合はどっちでもいけるっぽい

echo {10..0..2} # 10 8 6 4 2 0
echo {10..0..-2} # 10 8 6 4 2 0

この step 指定は bash 4 からの機能らしく,それ以前なら seq とか使うと良さそうですね.

seq 10 5 20 # 10 15 20

expansion のと step を書く場所が違うのに注意.

xargs で名前を再利用

{} : placeholder for text と書かれている.

ls . | xargs -i file {}
#            ^^      ^^

file みたいな引数1つのには旨味もないが,cp とかで使いたいときは多いはず.

というわけで今回の範囲っぽいのはこのあたり.膨大な文書なので折りにふれ見ていこうと思う.すぐ Python とかに頼るのも(状況によっては)あんまりよくないし.

  1. by Mendel Cooper. Granted to the Public Domain. (マジかよ!)

  2. これ Vim で書くとき,たとえばコード打つ→Yo#<C-o>:r!<C-r>0<CR> とかで行けていいですね.

  3. 因みに bash の version 3 からの機能らしい.今僕が使ってるのは 4.3.11.