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

Blog Single

今朝通勤中、凍った道路でペンギン歩きなるものを不本意にも習得しました、チエンです。

シェルスクリプトは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

まとめ

今回は本当に基本中の基本としか言えないような構文のみの学習となってしまいましたが、普段使っているプログラミング言語と構文の組み立て方や概念はあまり変わらないという印象です。
ゆくゆくはシェルスクリプトと他言語との特性の差異をより深く理解して活かせるようなプログラムを書けるようになりたいです。

冒頭で自分のシェルスクリプトに対するイメージはコマンドの自動化だと書きましたが、調べるとどうやらシェルスクリプトのみを使ってアプリを開発するユニケージ開発手法なるものもあるようで…。
やっぱりプログラミングというのはどこまでも奥が深いなと改めて思わされました。

参考

Posted by ChienKenichi
趣味はゲーム、映画、休日にたまにひっそりとバイオリン、、、 自己紹介で名前を聞き返される事に定評がある(本人談)

Other Posts: