シェルスクリプトかんたん7選
速習シェルスクリプト
シェルスクリプトの基本を厳選して7つにまとめます。
- args
- if文
- case文
- for文
- while文
- function
- seq
シェルスクリプトとは!?
シェルスクリプトとは、bashシェル等に備わっているスクリプト言語の事です。
複数のコマンドを一つのファイルにまとめておく事ができます。
No0: シェルスクリプトの実行
先ずは一丁目一番地、シェルスクリプトの実行方法です。
次のファイルを用意し、"test.sh"として保存しましょう。
#!/bin/bash
echo "Hello, World!!"
ファイルを用意したら実行してみましょう。
cdコマンドで同ファイルがあるディレクトリへ移動し、bashコマンドで次の様に実行します。
cd "test.shファイルのあるディレクトリ"
bash test.sh
実行結果は次の通りです。(やりました!!)
Hello, World!!
No1: args
何かしらのデータを渡して実行したい場合は次の通りです。
#!/bin/bash
echo "Running $0"
echo "arg1: $1"
echo "arg2: $2"
echo "arg3: $3"
"$0","$1"という謎の文字に注目してください。
これらの意味(一部)は次の通りです。
変数名 | 役割 |
---|---|
$0 | 実行ファイルの名前が格納されます |
$1 | 第一引数の値が格納されます(以下は$2,$3...) |
$# | 引数の総数が格納されます |
引数にデータを渡して実行するコマンドは次の通りです。
(hoge, fuga, piyoと3つ文字列を渡しています)
bash test.sh hoge fuga piyo
実行結果は次の通りです。(やりました!!)
Running test.sh
arg1: hoge
arg2: fuga
arg3: piyo
No2: if文
次はif文です。
ここでは、ファイルの存在を確認する判定処理を考えてみます。
対象のファイルを準備します。
テキスト文は、青空文庫吾輩は猫であるからコピーして"story.txt"として保存しました。
吾輩は猫である。名前はまだ無い。
どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。
// 以下略
"story.txt"を"test.sh"と同じディレクトリに保存し、次のスクリプトを用意します。
#!/bin/bash
txt="./story.txt"
if [ -f $txt ] ; then
echo "File is exists."
else
echo "File is not exists..."
fi
対象のファイル名は変数"txt"に格納しています。
(変数を使うときは"$"を使います)
if構文の条件にあたる箇所は、testコマンドの省略形である"["と"]"を使います。
"-f"は、ファイルとしての存在を判定します。
その他の条件(一部)は次のとおりです。
条件式 | 説明 |
---|---|
-f | ファイルが存在するかどうか |
-d | ディレクトリが存在するかどうか |
変数1 -eq 変数2 | 等しいかどうか |
変数1 -ge 変数2 | 変数1が変数2以上か |
変数1 -gt 変数2 | 変数1が変数2より大きいか |
変数1 -le 変数2 | 変数1が変数2以下か |
変数1 -lt 変数2 | 変数1が変数2より小さいか |
実行結果は次の通りです。(やりました!!)
File is exists.
No3: case文
次はcase文です。
#!/bin/bash
case $1 in
1) echo "吾輩は" ;;
2) echo "猫である。" ;;
3) echo "名前はまだ無い" ;;
4) echo "ですけど何か問題でも!?" ;;
esac
case文は、")"の前に条件を、実行文の末尾に";;"をつけます。
(くれぐれも忘れずに...)
引数を変えながら実行してみます。
bash test.sh 1
bash test.sh 2
bash test.sh 3
bash test.sh 4
実行結果が次の様であれば成功です。(やりました!!)
吾輩は
猫である
名前はまだ無い
ですけど何か問題でも!?
No4: for文
次はfor文です。
"story.txt"の文章を解析するサンプルを考えてみます。
#!/bin/bash
txt="./story.txt"
msgs=($(grep -oP "吾輩は.*?。" $txt))
for msg in ${msgs[@]}
do
echo $msg
done
先ず初めに、元の文章から"吾輩は"で始まり、"。"で終わる部分をgrepで抽出しています。
抽出結果は、変数"msgs"に配列として格納されます。
その後に続くfor文で先程の配列から順次結果を取り出しています。
実行結果は次のとおりです。(やりました!!)
吾輩は猫である。
吾輩はここで始めて人間というものを見た。
吾輩は藁の上から急に笹原の中へ棄てられたのである。
// 中略
吾輩は我慢に我慢を重ねて、ようやく一杯のビールを飲み干した時、妙な現象が起った。
吾輩は大きな甕の中に落ちている。
吾輩は死ぬ。
No5: while文
先ほどと同じ事を、while文で試してみましょう。
#!/bin/bash
txt="./story.txt"
msgs=($(grep -oP "吾輩は.*?。" $txt))
len=${#msgs[*]}
i=0
while [ $i -lt $len ]
do
echo ${msgs[$i]}
i=$((i+1))
done
msgs配列の格納数は、"${#msgs[*]}"で取得することができます。
この格納数とカウンタ値"i"を、後に続くwhileの条件式としています。
(iに+1をする事を忘れずに...)
実行結果は先ほどと同じになります。(ネタバレか!?)
吾輩は猫である。
吾輩はここで始めて人間というものを見た。
吾輩は藁の上から急に笹原の中へ棄てられたのである。
// 中略
吾輩は我慢に我慢を重ねて、ようやく一杯のビールを飲み干した時、妙な現象が起った。
吾輩は大きな甕の中に落ちている。
吾輩は死ぬ。
No6: function
関数もシンプルに記述することが可能です。
("function"は省略可能です)
#!/bin/bash
hoge(){
echo "Hello, Nobunaga!!"
}
fuga(){
echo "Hello, Hideyoshi!!"
}
greeting(){
echo "Good morning" $1 "," $2 "how are you today!?"
}
# 関数を実行する
hoge
fuga
greeting Ieyasu Date
引数がある場合、与えられたデータは"$1","$2"に格納されます。
実行結果は次のとおりです。(やりました!!)
Hello, Nobunaga!!
Hello, Hideyoshi!!
Good morning Ieyasu , Date how are you today!?
No7: seq
最後は変わり種です。
連番数を出すseqのサンプルです。
#!/bin/bash
for i in `seq 0 10`
do
echo "counter" $i
done
実行結果は次の通りです。(やりました!!)
0
1
2
# 中略
9
10
seqは何かと重宝するので知っていて損はありません。(そうですね!!)
最後に
今回はシェルスクリプトを7つ紹介致しました。
「なんだこんなもんかー」と拍子抜けしてしまうぐらい簡単です。
各コマンドの特徴さえ抑えてしまえば、様々なスクリプトを作る事が出来そうですね。
ここまで読んでいただき有難うございました。
Discussion