# 17.3. シェルスクリプト
**Source**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/shell/shellscript/
**Parent**: https://hwb.ecc.u-tokyo.ac.jp/hwb2023/literacy/email/
シェルスクリプトは、シェルに解釈・実行させるスクリプト (プログラム) です。
コマンドは基本的に一つずつ入力し実行させます。一連のコマンドを順に実行したい場合には、シェルスクリプトを書くと、
1度の指示で実行することができます。
## シェルスクリプトの例 [#](#script)
さっそく一つ、実践的な例を紹介してみたいと思います。それは「同じフォルダにある全ての画像を、一斉に 50% のサイズに縮小する」という例です。最近のデジタルカメラで撮った写真はサイズが大きいですから、たとえば人に渡すためにサイズを落としたいと思うことがあるのではないでしょうか?
これを GUI のアプリケーション行うには、一つ一つ写真を開いては縮小という作業を繰り返さないといけません。しかしシェルスクリプトを使えば、たった 1 行のコマンドだけで縮小作業を実現できます。それに使う道具が `convert` コマンドと `for` ループです。
`convert` コマンドは、画像を変換するためのコマンドです。たとえば
convert -resize 50% hoge.jpg hoge2.jpg
とすると `hoge.jpg` を 50% に縮小した結果が `hoge2.jpg` に格納されます。`hoge2.jpg` のところを `hoge.jpg` にすれば `hoge.jpg` が上書きされます。ちなみに `convert` コマンドにはもっとたくさんの機能があります。[16.4. convert コマンド](https://hwb.ecc.u-tokyo.ac.jp/hwb2023/applications/graphics/convert)
を見るなりヘルプを引いて調べるなりしてください。
for a in \*.jpg; do convert -resize 50% $a small\_$a ; done
と打つと、カレントディレクトリにある全ての `jpg` ファイルについて、 `convert` コマンドで 50% 縮小した `small_` で始まるファイルを作成することができます。このスクリプトは、次のように読みます。
- `*.jpg;` はカレントディレクトリにある全ての `jpg` ファイルを表します。そして `for a in *.jpg` と書くことで、カレントディレクトリにある `jpg` ファイルの名前が一つずつシェル変数 `$a` に代入され、その `$a` に対して `do` と `done` の間にある一連のコマンドを実行します。
- たとえばカレントディレクトリに `hoge.jpg` があれば、for ループが回る中でシェル変数 `$a` に `hoge.jpg` が格納されます。すると `convert -resize 50% hoge.jpg small_hoge.jpg` が実行され、`hoge.jpg` を 50% に縮小した画像が `small_hoge.jpg` に保存されます。
このようにシェルスクリプトがループを扱えるおかげで、複数の指示を1度に行うことができます。