Linuxコマンドでシェルスクリプト(shファイル)の作成・実行を行う方法についてオプションと例題付きでまとめました。
【1】シェルスクリプトの作成・実行・コメント
Linuxにおける、シェルスクリプトは、複数のLinuxコマンドを並べて組み合わせ実行する仕組みです。
拡張子shのファイルの中にシェルスクリプトを以下のように記述してターミナルで実行できます。
①拡張子shのファイル(example.shなど)を作成し、中に以下のように記述します。
#!/bin/sh # 「うまぴょい」と表示するコードです echo "うまぴょい" echo "うまぴょい"
② ターミナルで作成した拡張子shのファイル(example.shなど)を、以下のいずれかのコマンドで実行します。
$ chmod 755 example.sh $ sh example.sh $ bash example.sh
すると、「うまぴょい うまぴょい」と実行結果が表示されます。
ファイルの中身の最初の1行目(#!/bin/sh)は、シェルスクリプトであることを示すための記述で必ず書きます。
2行目の「# 「うまぴょい」と表示するコードです」はコメント文といいます。「#」以降に一行書かれた文字は実行されないため、好きなことを記述できます。通常は自分や他の人がコードを読んでもわかるような説明を入れます。
【2】シェルスクリプトの変数
シェルスクリプト内でも他のプログラミング言語のように変数を使えます。
変数とは、数値や文字などのデータを格納する場所です。
● 変数名には、半角英数字(a〜z、A〜Z、0〜9)とアンダーバー(_)が利用可能
● 変数に数値を入れる時は「変数=値」というように、前後空白なしで記述
# 数値357を変数varに代入 var=357
● 変数に文字列を入れる時には「変数=文字列」というように、前後空白なしで記述
# 文字列を変数varに代入 var="うまぴょい"
● 変数の中身にアクセスする時は、変数名の前に「$」を記述。(もしくは$を入れて変数を{}で囲む)
# 数値357を変数varに代入
var=357
# 変数varの中身(357)を標準出力
echo "varの中身は$var です"
# 数値356を変数varに代入(上書き)
var=356
# 変数varの中身(356)を標準出力
echo ${var}
● 変数の値を書き換えできないようにする場合、readonlyを使う
# 数値357を変数var(readonly)に代入 readonly var=357 # 以下のように値を上書きしようとするとエラーが表示される var=356
※エラーの例「shell.sh: line 6: var: readonly variable」
●以下の特殊文字を文字列として使う場合は、\の後ろに記述します。
【特殊文字】
(* ? [ ' " ` \ $ ; & ( ) | ~ < > # % = スペース タブ 改行
【変数として扱う場合】
# 文字列を変数varに代入
var="\?"
# 変数varの中身(特殊文字?)を標準出力
echo ${var}
● シェルスクリプトでは以下の特別な変数があります。
| 変数 | 機能 |
|---|---|
| $0 | スクリプト名 |
| $1 ~ $9 | 引数、1番目の引数を$1、2番目の引数を$2でアクセス |
| $# | スクリプトに与えた引数の数 |
| $* | 全部の引数をまとめて1つとして処理 |
| $@ | 全部の引数を個別として処理 |
| $? | 直前実行したコマンドの終了値(0は成功、1は失敗) |
| $$ | このシェルスクリプトのプロセスID |
| $! | 最後に実行したバックグラウンドプロセスID |
【3】シェルスクリプトの配列
配列は、複数の値や文字列を1つの変数に格納できる仕組みです。
ITEMS=(item1 item2 item3)
ITEMS[0]="ITEM1"
ITEMS[2]="ITEM3"
# 特定の場所のアイテムにアクセスして表示
echo "${ITEMS[0]}" # ITEM1
echo "${ITEMS[1]}" # item2
# すべてのアイテムにアクセスして表示
echo "${ITEMS[*]}" # ITEM1 item2 ITEM3
echo "${ITEMS[@]}" # ITEM1 item2 ITEM3
【4】 数値計算
シェルスクリプトには次の様な四足演算子が用意されています。
| 算術演算子 | 意味 |
|---|---|
| a + b | aとbの和を計算(足し算) |
| a – b | aとbの差を計算(引き算) |
| a * b | aとbの積を計算(掛け算、環境によってa * b と特殊文字*をエスケープすることもある) |
| a / b | aとbの商を計算(割り算) |
| a % b | aでbで割ったときの余りを計算 |
変数で四則演算します(bashの場合)。
#!/usr/bin/bash # 変数定義 var1=50 var2=10 # 計算して標準出力 echo $(($var1 + $var2)) # 60 echo $(($var1 - $var2)) # 40 echo $(($var1 * $var2)) # 500 echo $(($var1 / $Vvar2)) # 5 echo $(($var1 % $var2)) # 0
【5】比較演算子(条件式)
比較演算子(条件式)とは、「AはBより大きいかどうか」などを判別できるものです。
後で出てくる条件分岐や繰り返し処理などで使うため重要です。
数値の比較
| 演算子 | 意味 |
|---|---|
| 数値1 -eq 数値2 | 数値1と数値2が等しければ真(eq:equal to) |
| 数値1 -ge 数値2 | 数値1が数値2より大きい、もしくは等しければ真(ge:greater than or equal to) |
| 数値1 -gt 数値2 | 数値1が数値2より大きければ真(gt:greater than) |
| 数値1 -le 数値2 | 数値1が数値2より小さい、もしくは等しければ真(le:less than or equal to) |
| 数値1 -lt 数値2 | 数値1が数値2未満であれば真(lt:less than) |
| 数値1 -ne 数値2 | 数値1と数値2が等しくなければ真(ne:not equal to) |
文字列の比較
| 演算子 | 意味 |
|---|---|
| 文字列 | 文字列の長さが0より大きければ真 |
| -n 文字列 | 文字列の長さが0より大きければ真 |
| !文字列 | 文字列の長さが0であれば真 |
| -z 文字列 | 文字列の長さが0であれば真 |
| 文字列1 = 文字列2 | 2つの文字列が等しければ真 |
| 文字列1 != 文字列2 | 2つの文字列が等しくなければ真 |
【6】 条件分岐(if文)
条件分岐とは、「もし変数の値が〇〇以上なら☓☓を実行する」というように、条件付きで動作させることができる機能です。
【使い方】
● if [ 条件 ] then コマンド fiで条件分岐(if文)を記述します。
● 条件が真(条件を満たす)の場合、then のブロックを実行
● 違う場合、次々の elif [ 条件 ] を確認し、真の場合にそのthenのブロックを実行
● 真の条件がない場合 else のブロックを実行して終了
● else がない場合は、そのまま終了
【使用例】
#!/bin/sh
var1 = 357
var2 = 35
if [ var1 -gt var2 ]
then
echo "var1がvar2より大きい"
elif [ "$1" -eq "$2" ]
then
echo "var1とvar2は同じ"
else
echo "上記以外(var1がvar2より小さい)"
fi
上記のコードだと、var1 > var2なので、if [ var1 -gt var2 ]が真となり、そのthenの中にある標準出力が実行されて「var1がvar2より大きい」と表示されます。
【7】 繰り返し処理(while文)
繰り返し処理とは、その名のとおり同じ処理を繰り返し何度も行うことです。
while文を使うと、ある条件を満たすまで繰り返し同じ処理を行わせることができます。
while文は「while [終了条件] do コマンド done」と書きます。
test.sh
#!/bin/sh
var=0
while [ $var -lt 3 ]
do
echo $var
var=`expr $var + 1`
done
上記コードを実行すると、「0、1、2」と表示されます。
[ $var -lt 3 ]が繰り返し処理を終了するための条件(変数varの値が3未満)です。
doとdoneに囲まれた部分が繰り返し実行する処理(標準出力と変数varの値を1増やす)です。
つまり、変数varの値が1ずつ増えていき3になったら終了するというものです。
【8】 繰り返し処理(for文)
for分も繰り返し処理を行いますが、whileとは大きく使い方が異なります。
for文は「for 変数 in 範囲 do コマンド done」と書きます。
#!/bin/sh
for var in 0 1 2
do
echo $var
done
上記コードを実行すると、「0、1、2」と表示されます。
【9】 関数
シェルスクリプトでは、関数を作成できます。
test.sh
#!/bin/sh
# 関数を定義
MyFunc () {
echo "関数を呼び出しています"
}
# 関数を呼び出し
MyFunc
# 関数を呼び出し
MyFunc
上記コードを実行すると、「関数を呼び出しています」が2回表示されます。
引数(関数内に与える値)ありで関数を作成する場合は以下のようになります。
#!/bin/bash
# 関数の定義
MyFunc () {
echo "やあ、$name1 と $ name2!"
}
# 関数の呼び出し
MyFunc 太郎 次郎
上記コードを実行すると「やあ、太郎と次郎」と表示されます。

コメント