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シェルです.
- Bourne Shell(sh)
- Bourne-Again shell (bash)
- KornShell (ksh)
- Z Shell (zsh)
- C Shell(csh)
- TENEX C shell (tcsh)
環境変数$SHELLには「現在使っているログインシェルの絶対パス」が登録されています.
$ echo $SHELL
/bin/bash
ログインシェルとは,「コマンドで指定されない場合に使用するシェル」のこと.
※ ログインシェルを変えたい場合は,chshコマンドを使えばOK.
$ chsh -s /bin/zsh # ログインシェルを/bin/bashから/bin/zshへ変更
シェルコマンドはcdやcatなどの標準コマンドと同様に扱えます.
$ 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通りあります.
-
シェルコマンドを使う
$ bash test.sh Hello, World! -
ファイル自体をコマンドとして使う(ファイルの実行権限を追加)
$ 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
参考文献
- 初心者向けシェルスクリプトの基本コマンドの紹介 - Quitta, 2015.12.12