Link

Bash

動作環境:macOS Mojave 10.14.4

1. シェルとは?

シェル(Shell)とは,OSのカーネルへのアクセスを可能にするために,ユーザインタフェースを提供するソフトウェアの総称です.名前は,OSの内部(カーネル)とユーザ(アプリケーション)との間にある外殻であることに由来します.


1.1 シェルコマンド

macOSでは/binの下に,以下のようなシェルコマンドが標準インストールされています.

~ $ ls -l /bin | grep sh
-r-xr-xr-x  1 root  wheel   618416  3 21  2019 bash
-rwxr-xr-x  1 root  wheel   375824  3 21  2019 csh
-r-xr-xr-x  1 root  wheel  1278736  3 21  2019 ksh
-r-xr-xr-x  1 root  wheel   618480  3 21  2019 sh
-rwxr-xr-x  1 root  wheel   375824  3 21  2019 tcsh
-rwxr-xr-x  1 root  wheel   610240  3 21  2019 zsh

これらはいずれもよく使われているUnixシェルです.


環境変数$SHELLには「現在使っているログインシェルの絶対パス」が登録されています.

$ echo $SHELL
/bin/bash

ログインシェルとは,「コマンドで指定されない場合に使用するシェル」のこと.

※ ログインシェルを変えたい場合は,chshコマンドを使えばOK.

$ chsh -s /bin/zsh # ログインシェルを/bin/bashから/bin/zshへ変更


シェルコマンドはcdcatなどの標準コマンドと同様に扱えます.

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
$ zsh --version
zsh 5.3 (x86_64-apple-darwin18.0)


1.2 シェルスクリプトの実行

複数のLinuxコマンドをシェルスクリプト(.sh)に記述して,シェルコマンドでこのファイルを実行することができます.例として,test.shというファイルを作り,以下のように記述してみましょう.

#!/bin/sh

echo "Hello, World!"


また,シェルスクリプトの実行方法には2通りあります.

  1. シェルコマンドを使う

    $ bash test.sh
    Hello, World!
    
  2. ファイル自体をコマンドとして使う(ファイルの実行権限を追加)

    $ chmod 755 test.sh
    $ ./test.sh
    Hello, World!
    



2. シェルスクリプトの書き方

基本的に,初心者向けシェルスクリプトの基本コマンドの紹介(Quitta, 2015,12,12)が非常にわかりやすいです.詳しくはAsk google!してください.


2.1 コメント

#でコメントアウトできます


2.2 入出力

echoで出力、 readで入力です.

io.shというファイルを作り,以下のように記述してみよう.

#!/bin/sh

read NAME
echo "Hello, $NAME! How are you?"

実行するとreadで入力待ち状態になります.

実行結果

$ bash io.sh
Michita
Hello, Michita! How are you?


2.3 変数

  • 変数の名前として半角英数字とアンダーバーが使えます.(”a~z”,”A~Z”,”0~9”,”_*“)
  • 変数に値を与える時,=を前後空白なしで書きます.文字列の場合"で囲みます.
  • 変数をアクセスする時,変数名の前に$を入れます.あるいは変数を${}で囲みます.

また,以下の変数は,特別な意味を持ちます.特に引数を表す$1~9はよく使うので注意.

変数 機能
$0 スクリプト名
$1~$9 引数.1番目の引数を$1,2番目の引数を$2でアクセスする
$# スクリプトに与えた引数の数
$* 全部の引数をまとめて1つとして処理
$@ 全部の引数を個別として処理
$? 直前実行したコマンドの終了値(0は成功、1は失敗)
$$ このシェルスクリプトのプロセスID
$! 最後に実行したバックグラウンドプロセスID

* ? [ ' " \ $ ; & ( ) | ~ < > # % = スペース タブ 改行 はシェルスクリプトの特殊文字です.文字列として使うときは \ を書いてから使います.


2.4 演算子

算術演算子をexpr `数字 算術演算子 数字`で計算できます.

算術演算子 意味
+ echo `expr 10 + 20` => 30
- echo `expr 20 - 10` => 10
* echo `expr 11 \* 11` => 121
/ echo `expr 10 / 2` => 5
% 剰余 echo `expr 10 % 4` => 2
= 指定 a=\$b bの値はaに保存される.
== [ “$a” == “$b” ] $aと$bが同じ値の場合TRUEを返す.
!= 不等 [ “$a” != “$b” ] $aと$bが同じ値ではない場合TRUEを返す.


比較演算子で条件式を作ることができます.

比較演算子 意味
-eq equal [ "$a" -eq "$b" ] $aと$bが同じ場合TRUEを返す.
-ne not equal [ "$a" -ne "$b" ] $aと$bが違い場合TRUEを返す.
-gt > [ "$a" -gt "$b" ] $aが $bより大きい場合TRUEを返す.
-lt < [ "$a" -lt "$b" ] $aが $bより小さい場合TRUEを返す.
-ge >= [ "$a" -ge "$b" ] $aが $bより大きいか同じ場合TRUEを返す.
-le <= [ "$a" -le "$b" ] $aが $bより小さいか同じ場合TRUEを返す.
! NOT [ ! "$a" -gt "$b" ] $aが $bより大きくない場合TRUEを返す.
-o OR [ "$a" -gt "$b" -o "$a" -lt "$b" ] aがbより大きいか小さい場合TRUEを返す.
-a AND [ "$a" -gt 3 -a "$a" -lt 10 ] aが 3より大きく10より小さい場合TRUEを返す.



2.5 条件分岐


if文

if文を使ったシェルスクリプトを描いてみましょう.

  • ifの基本の書き方は if [条件式] then コマンド fi です.
  • 条件が真の場合 then の次のコマンドを実行します.
  • 違う場合次々の elif [ 条件 ] を確認します.
  • 真の条件がない場合 else の次のコマンドを実行して終了します.
  • else がない場合は、そのまま終了します.
#!/bin/sh

a=10
b=300

if [ "$a" -gt "$b" ] # 条件1
then 
		# 条件1がTrue
    echo "a > b"
elif [ "$a" -eq "$b" ] # 条件2
then
		# 条件1がFalseかつ条件2がTrue
    echo "a = b"
else
		# 条件1がFalseかつ条件2がFalse
    echo "a < b"
fi


switch文

  • switchの基本の書き方は case 変数 in 条件・値) コマンド ;; esac です.
  • 条件・値が変数と合う場合それの次のコマンドを実行します.
#!/bin/sh

EDITOR="vim"

case "$EDITOR" in
    "emacs") echo "Bad." 
    ;;
    "vscode") echo "Not bad." 
    ;;
    "vim") echo "Awesome!" 
    ;;
esac


2.6 ループ表現


while文

  • whileの基本の書き方は while [条件式] do コマンド done です.
  • whileは,条件が満たされる限りループします.
#!/bin/sh

a=0
while [ $a -lt 5 ]
do
    echo $a
    a=`expr $a + 1`
done

実行結果

$ ./while.sh
0
1
2
3
4


until文

  • untilの基本の書き方は until [条件式] do コマンド done です.
  • untilは,条件が満たされるまでループします.
#!/bin/sh

a=0
until [ ! $a -lt 5 ]
do
    echo $a
    a=`expr $a + 1`
done

実行結果

$ ./until.sh
0
1
2
3
4


for文

  • forの基本の書き方は for 変数 in 複数値・変数・範囲 do コマンド done です.
#!/bin/sh

for var in 0 1 2 3 4
do
    echo $var
done

実行結果

$ ./for.sh
0
1
2
3
4



3. 環境変数

シェルコマンド、およびシェルスクリプトは環境変数を利用できます.printenvコマンドで現在定義されている環境変数を一覧表示できます.

$ printenv
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/g5/zbwwk4dn47xgsc999xby2j8h0000gp/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.bpYdGvp7OP/Render
TERM_PROGRAM_VERSION=421.1.1
TERM_SESSION_ID=5172A6DD-C88E-4072-A585-1CC1D61D3D42
USER=uchiumi
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.Kr3cIp1TAV/Listeners
...

シェル変数はいつまでも入れておくことができません.いま起動しているシェルを終了してしまうと失われてしまいます.そのシェル変数を環境変数にすることで、いつ何度でもシェルを起動するたびに使えます.

export コマンドを使い、シェル変数を環境変数として設定します.

$ export LAB="imai lab"
$ printenv
...
LAB=imai lab



参考文献