『シェルスクリプトポケットリファレンス』でシェルスクリプトをポツポツ勉強しているのは、シェルスクリプトでやりたいことがあるから。
それは、ディレクトリ内のファイルのファイル名に連番を付記する、というもの。
例えばディレクトリ内に
aaa、bbb、ccc、ddd、eee
という5つのファイルがあったとき、これを
aaa1、bbb2、ccc3、ddd4、eee5
というふうにしたい(本当はもう少し入り組んだ処理をしたい)のです。
そのために
- ファイルを読み込む
for $hensu in `ls directory`; do - 連番を作る
for $renban in $saisho $saigo; do
という二つの処理を経て、最終的に
mv $hensu $hensu$renban
で行けると考えました。
が、この二つの構文を入れ子にしてしまうと
aaa1、aaa2、aaa3、aaa4、aaa5、bbb1、bbb2、bbb3・・・
というふうに、全てのファイル+全ての連番の組み合わせでファイルが作成されることに・・・。まぁ落ち着いて考えれば、そりゃそうですよね(笑)
手持ちのポケットリファレンスでは解決できそうになかったので、google先生にシェルスクリプトで連番を生成する方法を尋ねたところ、こういう回答が得られました。
i=`expr $i + 1`
今回のパターンなら、
for hensu in `ls directory` ;do
mv $hensu $hensu$saisho
saisho=`expr $saisho + 1`
done
で当初の目的である
aaa1、bbb2、ccc3、ddd4、eee5
が取り出せました。
参照先によれば、saisho++というC言語的記述も使えることもわかりましたが、その際にはこれを(( ))で括らないといけないんだそう。
それを知らずに普通にsaisho++だけ記述していたので構文エラーが返されてました(そのため、こういう表記はできないものだと思い込んでました)。
ただ、exprを使った方がより確実らしいそう。一つ勉強になりました。