シェルスクリプト (bash)
シェルスクリプトはシェルコマンドのリストを含むテキストファイルで、タスクまたは一連のタスクを実行するためにプログラムのように実行されるものです。 シェルスクリプトの主な目的は、タスクを自動化し、時間を節約することです。 シェルスクリプトを介してコンピュータクラスタと対話するため、シェルスクリプトの基本構造を理解することは重要です(次章グリッドエンジン参照)
Bashとは?
Unix系システムには多くの異なるシェルが利用可能です。 Bourne Again Shell (Bash)はその一つで、GNU/Linuxシステムのデフォルトのシェルです。 他のシェルと比較していくつかの利点があり、かなり標準的なシェルです。以下では、スクリプトに使用する方法を紹介します。
シンプルな bash シェルスクリプトを書く
基本的なシェルスクリプトは、一連のコマンドに過ぎません。
それでは、echo
コマンドを使って、画面に「hello world」と出力する簡単なスクリプトを書いてみましょう。 このテキストファイルをmyScript.sh
#!/bin/bash echo Hello World
execution a shell script syntax:bash your-script-name
という名前で保存しておきます。 この例では、
$ bash myScript.sh Hello World
より複雑な例
さらに多くのシェルコマンドを使って、もう少し複雑なスクリプトを書いてみましょう。 このスクリプトでは、ls
を使ってファイルをリストアップし、wc -l
コマンドを使ってファイルや標準入力の行数をカウントしている。 この場合、wc -l
はls -l
の出力の行数をカウントする。 script.shの内容:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
以下のように実行できる。
$ bash script.sh
bash scriptsの変数
bashスクリプトでも変数を使うことができる。 変数にはデータ型がありません。
変数を宣言する必要はなく、その参照先に値を代入するだけで変数が作成されます。 その変数にHello world
文字列を代入し、その変数をecho
で表示します。
#!/bin/bash VAR="Hello world" echo $VAR
変数を代入するときは$
記号を使いませんでしたが、変数を使うときは$
記号を使わなければなりませんでした。
bash scriptsにおけるコマンドライン引数
スクリプトもコマンドラインを取ることが可能です。 ここでは、ファイルをリストアップするスクリプトを変更して、コマンドライン引数を取るようにします。 引数には、ディレクトリへのパスを指定します。sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
スクリプトの実行方法です。
$ bash script2.sh /home/user/project
引数は1
- 最初の引数から順に番号が付いた変数に格納されます。 $1
- Second Argument: $2
- ・・・と続く。
我々の場合、が
/home/user/project
に対応する。
算術演算bashスクリプト
bashでの整数の算術演算は以下の形式で行われます:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
また、これらのコマンドをコピーペーストして、コンソールで動作を確認することが可能です。 echo
コマンドは 4
と 5
を出力するはずです。
Bash の演算は浮動小数点数をサポートしていないので (例えば 1.3 -1 の演算は bash では動きません) bc
コマンドを使う必要があります。
ファイルのループ処理
bashスクリプトを使用してタスクを自動化しようとすると、ディレクトリ内の各ファイルに対して特定のコマンドを適用しなければならない可能性が非常に高くなります。 これは、ワイルドキャラクター*
とfor
ループで実現できる。 次のスクリプトは、/path/to
ディレクトリにあるすべての ‘.txt’ ファイルを FILES
変数に格納する。
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
More on bash scripts
制御構造 (if/else, for/while loop) を使ってさらに複雑なシェルスクリプトを書くことができ、シェルスクリプトだけで多くのことを実現できるが、それはこの文書の範囲外である。 シェルスクリプトをもっとうまく書きたい場合は、以下のリンクを参照してください。
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/