殻を破るためのシェルスクリプト基礎

今朝通勤中、凍った道路でペンギン歩きなるものを不本意にも習得しました、チエンです。
シェルスクリプトはUNIX系OSを深く知るためには欠かせないものと思っていますが、業務では他の人がすでに作成してくれたものを使用するという形でしか触れることがなく、自分で書いたりしたことがなかったので、次の段階に進むためにも、この機に基本的な書き方から少しづつ学んでいこうと思った次第です。
シェルスクリプト??
OSを操作するシェルに対して実行できるプログラミング言語です。シェルはユーザーとカーネル(OSの中核)間のやりとりを中継するインターフェースのようなものですね。
ターミナルなどのコマンドラインインターフェースで実行できるコマンドなどをスクリプト言語のプログラムとしてドキュメントに記述し、そのプログラムを走らせることで中身のコマンドを自動で実行できるようになったりします。
まだ経験の浅い自分には、何かの作業で毎回同じような複数のコマンドを打つのが面倒な時などに活用するイメージしか今の所ないです(
ファイル作成
シェルスクリプトのファイルにはsh
の拡張子を用います。とりあえずファイルを作成して最低限の処理を書き込んでみます。
test.sh
#!/bin/bash
echo "hello world"
1行目#!
で始まる文は使用するインタプリタを指定しています。シバン
(shebang
)と言われるものです。シェルスクリプトの場合はシェルのパスを指定するのですが、詳細は省きますがシェルには様々な種類があり、本記事ではBash
というシェルを使用するため#!/bin/bash
という記述になります。
echo
はおなじみの指定した内容を出力するコマンドです。
実行
bashコマンド
$ bash test.sh
hello world
簡単な実行方法だとこのようにbash
コマンドで実行するやり方です。当然ですが、ファイルが別ディレクトリにある場合などはパスをきちんと指定する必要があります。
直接実行
ファイルパスだけで実行できるようにするには一手間挟む必要があります。今のままで実行しようとすると、
$ ./test.sh
-bash: ./test.sh: Permission denied
と権限がないため実行不可、となります。
実行権の確認
$ ls -l test.sh
-rw-r--r--@ 1 chien staff 31 2 1 15:26 test.sh
結果の一番左のrw-
を見て、r
(読み込み)とw
(書き込み)の権限はあるけど、x
(実行)の権限がないことを確認。
権限を付与するにはchmod
コマンドを使用します。
$ chmod 755 test.sh
755
とはざっくり言うと権限の度合いです。0から7の段階があり、左から所有者、グループ、その他の順で3桁の数字の形で割り当てられます。
$ ls -l test.sh
-rwxr-xr-x@ 1 chien staff 31 2 1 15:26 test.sh
$ ./test.sh
hello world
これでファイルパスだけで実行できるようになりました。
次は基本構文の書き方を見ていきます。
変数
#!/bin/bash
# 変数宣言: =の両端にスペースを挟まない
var="hello world"
# 変数出力: $をつけると変数として参照される
echo $var
$ ./test.sh
hello world
引数を受け取る
#!/bin/bash
# $n でn番目の引数を取得。10番目以降は ${10} のように{}で括る。
echo $1
echo $2
$ ./test.sh 1番目 2番目
1番目
2番目
testコマンド & 比較
#!/bin/bash
# 条件が真の時に0、偽の時に1を出力
test $1 -eq $2; echo $?
$ ./test.sh 5 5
0
$ ./test.sh 5 10
1
シェルスクリプトでの比較演算子の書き方はPHPやJavaのとは異なります。
基本的に英語の略語を用いる形で、例えばイコールは-eq
、大なり(>)は-gt
(greater than)といった具合です。
if文
#!/bin/bash
# [の後、]の前には必ずスペースをつける
if [ $1 = "hello" ]; then
echo "equal"
else
echo "not equal"
fi
$ ./test.sh hello
equal
$ ./test.sh goodbye
not equal
for文
#!/bin/bash
# ループの処理対象となる値を全て列挙する
for var in 1 2 3 4 5
do
echo $var
done
$ ./test.sh
1
2
3
4
5
まとめ
今回は本当に基本中の基本としか言えないような構文のみの学習となってしまいましたが、普段使っているプログラミング言語と構文の組み立て方や概念はあまり変わらないという印象です。
ゆくゆくはシェルスクリプトと他言語との特性の差異をより深く理解して活かせるようなプログラムを書けるようになりたいです。
冒頭で自分のシェルスクリプトに対するイメージはコマンドの自動化だと書きましたが、調べるとどうやらシェルスクリプトのみを使ってアプリを開発するユニケージ開発手法
なるものもあるようで…。
やっぱりプログラミングというのはどこまでも奥が深いなと改めて思わされました。