シェルスクリプトでのfor文の書き方
基本的な書き方
-
inの後に並べたワードリスト
がループ内で「val」として順番に扱われる - 処理は
do
とdone
で挟む - 処理内でワードリストの値はforの後の文字列に
$
をつけて呼び出す
for val in list1 list2 list3 #「list*」がワードリストです
do
echo $val #先頭に$をつけてワードリストの値をループごとに左から順番に設置されます
done
**結果**
list1
list2
list3
ポイント
C言語やJavaのfor文は「ループカウンタ」を用意しカウンタの数だけ繰り返しすることが殆どだと思います。
シェルスクリプトでのforは、「ワードリスト」を使って繰り返しをするという違いがあります。
Javaなどのfor文のような記述も出来るようになっているが、ワードリストをつかうほうがbashでは一般的のようです。
また、シェルスクリプトでのforは、比較的繰り返し条件が単純な場合に利用されます。
※ 複雑な条件式が必要な場合は「while」を使用するのが一般的のようです。
ワードリストは、処理の中で使わなくてもOK
do,doneの間に記述される処理にワードリストを使わない場合、単純にワードリストの個数分同じ処理がされるだけです。
seqコマンドで、連続した数字を出力
seq
の後ろに数字を1つだけ入れると1からスタートしてその数字までの連番が出力さますます。
seq 5
1
2
3
4
5
# 値の個数: 5個
ちなみに以下のように2つ並べると開始の数字を決められる(今回は-2からスタートしている)
seq -2 6
-2
-1
0
1
2
3
4
5
6
# 値の個数: 9個
ワードリストの代用として使える
ワードリストの入れる箇所に、seqコマンドをバッククウォーテーションで囲って記述するとseqコマンドが実行され結果の値や値の個数をワードリストとして使えます。
for val in `seq 3` #必ずバッククウォーテーションで囲います
do
touch file$val.txt
done
**結果**
file1
file2
file3
練習
【作るもの】
バックアップコマンド
カレントディレクトリにある全てのファイルとフォルダをBACKフォルダにコピーする。
【手順】
ファイルは Desktop/sh 内に作成します。
ファイル作成とパーミッションの変更
touch sh/folderBack.sh # ファイル作成
chmod 755 sh/folderBack.sh # 権限変更
パスを通す
これでローカルPC内であれば、どこからでもファイル名だけで実行できるようになります。
export PATH=$HOME/Desktop/sh:$PATH
source ~/.bashrc
source ~/.bash_profile
スクリプト内容
vi sh/folderBack.sh # エディタで編集(ここはエディタであればなんでもOK)
# !/bin/sh
# カレントディレクトのファイルとフォルダをBACK/にコピー
for i in `ls -a *`
do
mkdir -p BACK/
cp $i BACK/$i.back
done
実行
バックアップするファイルが無いと試せないので、事前にshフォルダには、作成しているfolderBack.shファイルの他に、for.shファイル、print.shファイルで合計3ファイルがあり、その状態で実行します。
実行前のshフォルダ内
tree
.
├── folderBack.sh
├── for.sh
└── print.sh
実行
folderBack.sh
結果
BACKフォルダ
が作成され、その中にファイル名の最後に.back
が追加された状態でコピーができました。
実行後のshフォルダ内
tree
.
├── BACK
│ ├── folderBack.sh.back
│ ├── for.sh.back
│ └── print.sh.back
├── folderBack.sh
├── for.sh
└── print.sh
参考