ターミナルで開発をやってると、シェルスクリプトに触れる機会があると思います。
シェルスクリプトは他のプログラミング言語と違い、少し癖のある書き方をする場合が多いため、読めるようで読めないことが多いです。
せっかくなら読み書き出来たらいいなと思い、勉強がてら基本的な使い方をまとめてみました。
シェルスクリプトの作り方
拡張子
シェルスクリプトファイルには「.sh」の拡張子があるものとないものがあります。
シェルスクリプトは、拡張子を必要としないので「.sh」はなくてもいいのですが、つけておくとエディタなどで開いたときに、シェルスクリプトとして認識してくれるというメリットがあります。
Shebang(シバン)
シェルスクリプトの一行目には、必ず「#!/bin/bash」を記述します。
「#!」は「Shebang(シバン or シェバン)」と呼ばれ、そのスクリプトを実行するインタプリタのパスを指定しています。
上記は「bash」の場合ですが、他のインタプリタを指定する場合は違ってきます。
指定するパスがわからない場合は「which」コマンドで探しましょう。
$ which zsh
/usr/local/bin/zsh
標準出力
実行結果などをコマンドラインに出力するためには「echo」を使用します。
大半のプログラミング言語では、文字列をクオーテーションで囲みますが、シェルスクリプトでは、囲まなくても文字として出力することができます。
echo Hello!
文字の間にスペースなどがある場合は、ダブルクオーテーションかシングルクオーテーションで囲みます。
echo "Hello World!"
echo 'Hello World!'
コメントアウト
「#」を入力した行末までがコメントとして扱われます。
コメントは、行の途中からでも記述可能です。
# コメント
echo "Hello World!" # コメント
シェルスクリプトの実行
例として「Hello World!」出力するだけの「hello.sh
」を作成します。
#!/bin/bash
echo "Hello World!"
ファイルを保存したら、ファイルに実行権限を付与し、実行します。
$ chmod +x hello.sh
作成したシェルスクリプトは、パスが通っていないため、パスを指定して実行します。
$ ./hello.sh
Hello World!
実行権限がない場合は、以下のように「bash」コマンドで実行することもできます。
この場合は、シバンは必要なくなります。
$ bash hello.sh
Hello World!
演算子
算術演算子
シェルスクリプトは、他のプログラミング言語と同じように以下のような算術演算子が用意されています。
算術演算子 | 意味 |
---|---|
a + b | a と b の和を計算する |
a - b | a と b の差を計算する |
a * b | a とb の積を計算する |
a / b | a とb の商を計算する |
a % b | a で b で割ったときの余りを計算する |
シェルスクリプトで演算するには、以下のように記述する必要があります。
#!/bin/bash
echo $((5 + 5)) # 10
echo $((5 - 5)) # 0
echo $((5 * 5)) # 25
echo $((5 / 5)) # 1
echo $((5 % 5)) # 0
変数
シェルで変数を宣言するには、以下のように記述します。
hoge="Hello World!"
宣言した変数を使用するには、以下のように記述します。
echo $hoge # Hello World!
また、ダブルクオート内では「${変数名}」で直接変数を展開することができます。
しかし、シングルクオートでは文字列として扱われてしまうので、注意が必要です。
echo "${hoge}!!!" # Hello World!!!!!
echo '${hoge}!!!' # ${hoge}!!!
シェルの変数宣言では、以下のような注意事項があります。
- 「=」の左辺と右辺にはスペースを入れない。
- スペースを入れると、コマンドとして認識されてしまう。
- 変数名には「英数字」と「_(アンダースコア)」のみ使用できる。
- 変数名は数字から初めてはいけない。
- 大文字と小文字は区別される。
- 変数はスコープは基本的にグローバルになる。
特殊変数
シェルスクリプトには、実行時のスクリプトの状態を保持する変数があります。
この変数は「特殊変数」と呼ばれ、基本的な特殊変数は以下のようなものがあります。
変数名 | 意味 |
---|---|
$0 | スクリプト名 |
$# | 渡された引数(パラメータ)の個数 |
$* | 引数に渡されたすべての値($0以外) 「"$*"」のようにダブルクオートで囲むと、"$1 $2 … $n" 形式になる |
$@ | 基本的に「$*」と同じ 「"$@"」のようにダブルクオートで囲むと、"$1" "$2" … "$n" 形式になる |
$1, $2, ..$N | N番目の引数の値 |
${@:N} |
N番目以降の引数の値 |
$? | 最後にシェルが実行したコマンドの終了状態(リターンコード) |
$$ | 実行中のシェルのプロセスID |
$! | シェルが最後に実行したバックグラウンドプロセスのPID |
実際に実行してみると、以下のようになります。
#!/bin/bash
echo $0
echo $#
echo $1
echo $*
echo $@
echo ${@:3}
echo $?
echo $$
$ ./var.sh hoge fuga piyo hogera
./hello.sh
4
hoge
hoge fuga piyo hogera
hoge fuga piyo hogera
piyo hogera
0
30180
キーボード入力
シェルスクリプトでキーボードから入力を受け付ける場合は「read」コマンドを使用します。
#!/bin/bash
echo -n "Please enter: "
read input
echo $input
複数の値を受け取りたい場合は、スペース区切りで変数を列挙します。
#!/bin/bash
echo -n "Please enter: "
read input1 input2 input3
echo $input1
echo $input2
echo $input3
条件分岐
if 文
シェルスクリプトの if 文は、以下のように記述します。
if [ 条件1 ]; then
# 処理1
elif [ 条件2 ]; then
# 処理2
else
# 処理3
fi
if 文で使用されている [
は、ただの括弧ではなく/bin/[
というコマンドであるため、[
の後ろには必ずスペースが必要となります。
また、]
の後ろにある ;
も同一行に複数のコマンドを記述するための区切り文字のため、忘れないようにしましょう。
条件分岐の中では、必ず何かしらの処理を記述しなければエラーになります。
そのため、もし何もしない行がある場合は「:(セミコロン)」を記述しておきます。
case 文
シェルスクリプトには switch 文 が存在しないため、代わりに case 文を使用します。 case 文は、以下のように記述します。
case 変数 in
マッチパターン1 ) # 処理1
# 処理1;;
マッチパターン2 ) # 処理2;;
マッチパターン3 ) # 処理3;;
esac
処理の最後には「;;(セミコロン2つ)」が必要になるので、注意しましょう。
また、パターンの部分には「変数」「|(or)」「*」のほか、「?(任意の1文字)」や「[ ~ ]([ ]内のいずれか1文字、範囲指定も可能)」を使うことができます。
反復処理
for 文
シェルスクリプトでも for 文は、以下のような構文になります。
他のプログラミング言語でいうところの foreach 文に近いです。
for 変数 in リスト
do
# 処理
done
bash では、以下のような記述も可能です。
for ((i=0 ; i<10 ; i++))
do
echo $i
done
while 文
while 文は以下のように記述します。
while [ 継続条件式 ]
do
# 処理
done
無限ループにするには、継続条件式に「:(セミコロン)を指定します。
終了するための条件を記述するのを忘れないようにしましょう。
while :
do
read str
if [ "$str" = "end" ]; then
break
fi
done
参考サイト
- 【初心者でもわかる】Linuxシェルスクリプト入門 まとめました
- 初心者向け!シェルスクリプト演算子まとめました【Linux】
- 【初心者〜中級者向け】シェルスクリプトの変数の使い方まとめ
- 【Linux】シェルスクリプトでキーボード入力を受付ける方法
- bash シェルスクリプト入門 -シェルスクリプトのいろは- | UNIX & Linux コマンド・シェルスクリプト リファレンス
- bash のビルトインコマンド “local” について - いままでのこと
- Shell 特殊変数
- # シェルスクリプトで使える if,test,for,case,set,readコマンド - Foreverly
- 【シェルスクリプト】条件分岐させるifの使い方!
- 3分理解!シェルスクリプトでのcaseの使い方
- 【初心者向け】シェルスクリプトforの使い方(各種サンプル付き)
- シェルスクリプトに挑戦しよう(9)制御構文[その2]――caseによる条件分岐 (1/2)