【Linux】シェルスクリプトとは?使い方やコマンドの初心者向けまとめ
この記事からわかること
- Linux:シェルスクリプトとは?
- 基本的なコマンドの使い方と作成方法
- 意味やメリット
- 演算子やif文、比較式
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
シェルスクリプトとは?
- コマンドをまとめて実行できる仕組み
- テキストファイルとして保存
- コマンドラインで読み込むと実行される
- 記述方法にはルールがある
- 変数やif文、ループ処理も実現可能
シェルスクリプトとはScript(台本)の意味からも連想できる通り、あらかじめコマンドを複数記述しておき一括で自動実行させることができる仕組みです。
シェルスクリプトはテキストファイルとして保管しておき、必要な時に実行して使用します。ログの記録や決まったファイルの移動、変数の定義、条件によるコマンドの分岐などシェルから操作できるさまざまな処理を一度の実行で行うことができるようになります。
例:スクリプトファイルの中身
#!/bin/sh
if [ -z "$num" ]
then
echo "この変数の中身は空です"
elif [ 4 -eq "$num" ]
then
echo "この変数の値は4です"
else
echo "この変数の値は4以外です"
fi
コマンドを短縮できる簡易版にエイリアスがあるので併せて参照してみてください。
基本構文と記述ルール
- 拡張子は「.sh」
- ファイルの1行目に「#!/bin/sh」
- コメントアウトは「#」
厳密には拡張子に決まりはありませんが識別しやすいように「.sh」がおすすめされています。
スクリプトファイルの1行目には「#!」から始まる文を記述します。「シェルスクリプトだよ」という区別と実行するシェルを明示するための1行です。(「#!」はシェバン(shebang)と読みます。)
#!/bin/bash や #!/bin/sh
スクリプトファイル内でコメントを残すには行頭に「#」を記述します。
#!/bin/sh
# これはコメントです
echo "Hello World!!"
シェルスクリプトファイルを作成する
作成する方法はいろいろありますが今回はviエディタを使用して作成してみます。作成したい階層に移動したらvi
コマンドの引数にスクリプトファイル名を記述します。引数に指定したファイルがあればそのファイルを、なければ自動で作成してそのファイルを編集できる状態で開いてくれるのがvi
コマンドです。
$ vi sample.sh // ファイルがなければ自動作成
実行すると以下のようになります。~
はその行に文字が何もないことを表しています。
~
~
~
"sample.sh" [New]
この状態でi
キーを押しインサートモードに切り替えて中にスクリプトファイルの記述ルールに沿ってコマンドなどを記述します。
#!/bin/sh
echo "Hello World!!"
~
~
~
"sample.sh" [New]
記述できたらESC
キーでインサートモードを解除し:wq
で保存してviエディタを閉じます。viエディタの詳しい使い方は以下の記事を参考にしてください。
シェルスクリプトを実行する方法
実行するにはsh
コマンドを実行するだけです。カレントディレクトリを作成時から移動していた場合は相対パスなどで指定してください。
実行するコマンド
$ sh sample.sh
Hello World!!
実行するコマンド(bash)
使用しているシェルがbashの場合はbash
コマンドでも実行できます。
$ bash sample.sh
Hello World!!
シェル変数を組み込んだ場合の実行コマンド
シェル変数をスクリプト内で使用したい場合はsource
コマンドを使います。(shやbashでは不可)
#!/bin/sh
$ echo $num
$ msg="書き換えたよ"
$ num=5
$ msg="シェル変数です"
$ source sample.sh
5
$ echo $msg
書き換えたよ
シェルスクリプト外で定義されたシェル変数を参照する場合は上記の通りですが、スクリプトファイル内で変数を定義、使用する際にはsource
コマンドでなくても問題ありません。
スクリプトファイル自体に実行権を付与する
スクリプトファイル自体に実行権を持たせればコマンドのように使用することもできます。
実行させるにはスクリプトファイルを入力してEnterを押すだけです。しかし絶対パスもしくは相対パスで指定する点に注意してください。
$ chmod u+x sample.sh // 実行権を付与
$ $HOME/sample.sh // 絶対パス(置き場所によって変化)
または
$ ./sample.sh // カレントディレクトリからの相対パス
カレントディレクトリの配下にあっても./
が必要になります。そのまま実行しようとするとエラーが出るので注意してください。
$ sample.sh
zsh: command not found: sample.sh
環境変数である$PATH
にファイルまでのパスを登録しておけばよりコマンドらしく扱うこともできます。
実行時に引数を渡す
$ sh sample.sh ame
Hello ame!!
通常のコマンドのように実行時に引数を渡すことも可能です。渡された引数にアクセスするには$1
と言った$数字
形式の特殊な変数で参照します。(数字は引数の番号)例えば先ほどの第一引数に渡した「ame」を参照するにはファイル内で$1
とします。
#!/bin/sh
echo "Hello $1!!"
特殊な意味を持つ変数
このようにスクリプトファイル内で特殊な意味を持つ変数が他にも存在します。
変数名 | 概要 |
---|---|
$0 | スクリプトファイル名 |
$1〜9 | 引数を参照 2番目なら$2、5番目なら$5 |
$? | 1つ前のコマンドの成否(成功なら0) |
$# | 引数の数 |
$* | 引数をまとめて参照 |
#!/bin/sh
echo "スクリプトファイル名:$0"
echo "1番目の引数:$1"
echo "2番目の引数:$2"
echo "成功したか:$?"
echo "引数の数:$#"
echo "引数全て表示:$*"
$ sh sample.sh ame HELLO
1番目の引数:ame
2番目の引数:HELLO
成功したか:0
引数の数:2
引数全て表示:ame HELLO
if文条件分岐
シェルスクリプトの中ではif文も使用できます。条件にはもちろん真偽値を返す式を記述します。構文は以下の通りです。
if [ 条件 ] then コマンド fi
複数の条件や条件を満たさない場合
if [ 条件 ]
then
コマンド
elif [ 条件 ]
then
コマンド
else
コマンド
fi
計算式
シェルスクリプトでは数値などの計算は`expr 計算式 `
に形式で記述します。expr
を書き忘れるとcommand not found
などと出るので注意してください。
#!/bin/bash
echo `expr 10 + 50`
変数を式に混ぜる
式に変数を混ぜる際は""
で囲みます。
#!/bin/bash
num=12
echo `expr 10 + "$num"``
使用できる演算子
演算子 | 意味 |
---|---|
+ | 足し算 |
- | 引き算 |
\* | 掛け算 |
/ | 割り算 |
% | あまり |
使用できる比較式
演算子 | 意味 |
---|---|
== (または-eq) | 等しい |
!= (または-ne) | 異なる |
-gt | >(より大きい) |
-lt | <(より小さい) |
-ge | =>(等しいか大きい) |
-le | =<(等しいか小さい) |
! | 否定 |
-a | AND |
-o | OR |
-z | 文字列が空か |
-n | 文字列に値があるか |
使用例
#!/bin/sh
if [ -z "$num" ]
then
echo "この変数の中身は空です"
elif [ 4 -eq "$num" ]
then
echo "この変数の値は4です"
else
echo "この変数の値は4以外です"
fi
入力を受け入れる
read
コマンドを使えば実行時に入力値を組み込むことができます。引数に入力値を格納する変数を渡します。
#!/bin/sh
read msg
echo $msg
実行すると入力待ちの状態になるので文字列を入力するとそれが出力(echo)されます。
ループ処理
条件が真の間ループ
while [ 条件式 ]
do
コマンド
done
条件が偽の間ループ
until [ 条件式 ]
do
コマンド
done
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。