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