シェルスクリプトの作法
シェルスクリプトはファイルの拡張子を「.sh」にし、ファイルの一行目で使用するシェルを宣言する必要があります。
使用するシェルの宣言はシェバンと呼ばれ、「#!/bin/使用するシェル」で行います。以下の例ではbashを使用するシェルとして宣言しています。
ちなみに、使用できるシェルの一覧は「cat /etc/shells」で確認できます。
#!/bin/bash
# 実現したい処理を記載
変数への代入と参照
変数へ代入する場合は変数名を=で繋げば代入されます。文字列を代入する場合はシングルクオート'か、ダブルクオート"で囲ってください。
注意点として、=の前後に空白など含めずに連続して記載する必要があります。
変数へ代入 | num=10 var='任意の文字列' |
コマンドの実行結果を変数に代入 | var2='command' var2=$(command) |
変数の参照 | $num $var |
#!/bin/bash
### 変数へ代入
num=10 # 数値を変数に代入
var="任意の文字列" # 文字列を代入
### コマンドの実行結果を変数に代入
com1=`ls` # バッククオートで囲む
com2=$(pwd)
### 変数を参照
echo $num # 「10」が出力される
echo $var # 「任意の文字列」が出力される
echo $com1 # 「base.sh」が出力される
- 初めから用意されている変数
この表の変数は$BASHとして呼び出すことで、対応する値(この場合はbashのpath)を取得できます。
BASH | bashのpath |
BASH_VERSION | bashのバージョン |
HOME | ホームディレクトリ |
PWD | カレントディレクトリ |
配列の定義
配列は複数の要素を1つの変数に格納することができます。配列は( )で囲むことで定義できます。
### 配列の定義
list=(val1 val2 val3)
### 配列の表示方法
echo ${list[@]} # 配列の中の値を全て表示
echo ${list[0]} # インデックス0の要素(val1)を取得
echo ${!list[@]} # インデックスを表示
echo ${#list[@]} # 配列の要素数を表示
### 配列に要素を追加
list[3]=val4 # 配列のインデックス3に要素を追加
### 配列から要素を削除
unset list[1] # 配列のインデックス1を削除
配列の注意点として、unset list[1]で要素を削除した場合、配列のインデックスは0 2 3 となり、1番が飛びます。つまりecho ${list[1]}で参照しても空っぽです。
実行時の引数
シェルスクリプトを実行する際にファイル名に続けて、要素を入力することで引数として渡すことができます。
ここでは引数を入力し、スクリプト内で取得する方法を紹介します。
- スクリプト実行時に引数を指定する
$ bash hikisu.sh var1 var2 var3
- スクリプト内で引数ほかを取得
$数字 | 数字番目の引数を参照(1始まり) |
$0 | スクリプトのファイル名を取得 hikisu.sh ※ファイル名は実行ファイルの指定方法で変わる 絶対Pathで指定すると、表示も絶対Pathになる。 |
$@ | 全ての引数を参照 val1 val2 val3 |
$# | 引数の数を参照 3 |
#? | 直前に実行したコマンドの戻り値(成功の場合0, 失敗の場合はそれ以外) |
- 実行例
# 実行したコマンド
# bash hikisu.sh apple tomato 30
# スクリプト内で引数を参照
echo $2 # 出力:tomato
echo $0 # 出力:hikisu.sh
echo $@ # 出力:apple tomato 30
echo $# # 出力:3
echo $? # 出力:0
標準入出力
キーボードからの入力を受け付ける標準入力と、ターミナルへの出力を行う標準出力の書き方を紹介します。
### 標準入力
read var # 変数を受け取り、varに代入
read var1 var2 var3 # スペース区切りで複数入力可
# オプション -p: 入力を求めるメッセージを表示する
read -p 'var: ' var
# オプション -s: シークレットモード。入力メッセージを非表示にする。
# オプション -a: 配列を入力する
read -a lists
# ※入力はスペース区切りで行う
# 例: read -a apple banana lemon
### 標準出力
echo $var
四則演算
四則演算を行う方法は $(( ))で囲う方法と、$( expr )の中に記載する方法の2通りあります。
- 四則演算の構文
$(( 演算式 )) | 例:echo $(( var1 + var2 )) ※ 変数の前に$を付ける必要がない。 ※ 演算子: +, -, *, /, % |
$( expr 演算式 ) | 例:echo $(expr $var1 + $var2 ) ※ 変数の前に$を付ける必要がある。 ※ 演算子: +, -, ¥*, /, % |
- 実行例
# 計算用の変数を用意
var1=2
var2=3
### $(( 演算式 ))
# 演算子: +, -, *, /, %
echo $(( 1 + 1 )) # 2と表示される
echo $(( var1 + var2 )) # 5と表示される
### $( expr 演算式 )
# 演算子: +, -, ¥*, /, %
echo $(expr 1 + 1 ) # 2と表示される
echo $(expr $var1 + $var2 ) # 5と表示される
### 浮動小数点の計算: | bc
echo "20.5+5" | bc # bcコマンドで文字列20.5+5を計算する
# 変数を用いる場合
echo "$num1+$num2" | bc
条件分岐
if文
条件に該当するか否かで処理を分岐するのに使用します。
注意点として、条件文で比較を行う場合(=で文字列一致判定など)は演算子の前後にスペースを入れましょう。
- if文の構文
if [ 条件文 ]; then
処理
elif [ 条件文 ]; then
処理
else
処理
fi
- 条件式の記載パターン
if test 条件文; | 例:if test $var = orange |
if [ 条件文 ] | 例:if [ $var = tomato ] ※ [ ] の前後にはスペースを入れる必要がある |
if [[ 条件文 ]] | 例:if [[ $var = chicken ]] |
- 実行例
### 実行
### if.sh orange
#/bin/bash
var=$1
if [ $var = orange ]; then
echo fruit
elif test $var = tomato; then
echo salad
elif [[ $var = chicken ]]; then
echo meat
else
echo others
fi
case文
パターンを複数列挙し、該当する処理を実行します。
# 基本構文
case $var in
パターン )
処理 ;;
パターン )
処理 ;;
esac
#!/bin/bash
var=$1
case $var in
[0-9] ) # 0~9の数字の場合
echo 'number';;
[a-z] ) # a~zの小文字の英字の場合
echo 'small letter';;
[A-Z] ) # A~Zの大文字の英字の場合
echo 'capital letter';;
esac
条件式の記載方法
条件式の記載方法は、「文字列の比較を行う場合」、「数値の比較を行う場合」、「ファイルの状態に応じた式を用いる場合」、「条件式を組み合わせる場合」で記載方法に癖があるので順番に紹介していきます。
ループ
ループ処理として、for、while、untilを紹介します。よく用いるのはforとwhileです。
for
# 基本構文
for i in 1 2 3 4 5; do
処理
done
# 便利な表現方法 seqコマンド
for i in `seq 1 10`; # 1~10までの整数でループ
for i in `seq 1 2 10`; # 1 3 5 7 9 でループ
# コマンドを代入してループ
for command in ls pwd date;
do
$command # コマンドを実行
done
while
# 基本構文
while [ 文字列の比較 ] # 数値の比較の場合は:(( 数値の比較 ))
do
処理
done
# ファイルを読み込む場合
# 実装方法1
while read p # 変数pの中にファイルの中身が一行ずつ読み込まれる
do
処理
done < aa.txt # aa.txtを一行ずつ読み込む
# 実装方法2
cat aa.txt | while read p
do
処理
done
until
# 基本構文
until [ 文字列の比較 ] # (( 数値の比較 ))
do
処理
done
関数
関数を定義する方法と関数を呼び出す方法を紹介します。
また、関数内の変数をローカル変数にするには明示的に指定する必要があります。
# 基本構文
function 関数名(){
処理
}
# 関数の呼び方
関数名 '引数'
※ 変数の場合は$変数として渡す
# 関数内の変数をローカル変数にする
function 関数名(){
local 変数
}
参考
・Linuxコマンド、シェルスクリプト、データベース、ネットワーク 、セキュリティを覚える講座
シェルスクリプトを勉強するにあたってUdemyのこちらの講座が分かりやすかったので紹介しておきます。演習問題と動画による解説もあるので練習したい方は受講してみてはいかがでしょう。
LPIC対策講座もセットなのでボリュームはありますが、それぞれ独立して学習できました。
コメント