- 追加された行はこの色です。
- 削除された行はこの色です。
** 動作環境 [#j8033748]
- OS X 10.11 El Capitan
- Vagrant 1.8.1
- VirtualBox 5.0.20 r106931
$ echo $SHELL
/bin/bash
** Hello World [#rcbf07b4]
$ vim hello.sh
#!/bin/bash
echo "hello world"
exit 0
# echo "hello world"; exit 0 でも可
$ chmod +x hello.sh
./hello.sh
hello world
** 変数を使ってみよう [#o5244a44]
#!/bin/bash
# 変数の代入は"="の前後にスペースを空けてはいけない
s="hello"
# 変数を利用する場合は"$"を使う
# 以下のいずれの書き方もOK
# 以下の何れかの書き方でOK
echo $s
echo "$s"
echo "${s}"
# 文字列の連結
echo $s$s
echo "$s $s"
# シングルクォーテーションは変数展開されない
echo '$s'
$ ./hello.sh
hello
hello
hello
hellohello
hello hello
$s
** 数値演算をしてみよう [#le4a78b1]
#!/bin/bash
x=10
echo $x+2 # "$x+2"という文字列となり計算されない
echo `expr $x + 2`
$ ./hello.sh
10+2
12
** 四則演算をしてみよう [#xc0e1839]
#!/bin/bash
x=10
echo `expr $x - 2` # 引き算
echo `expr $x / 2` # 割り算
echo `expr $x \* 2` # 掛け算
echo `expor \( $x + 5 \) \* 2` # 括弧を含む計算
# *や()の前にエスケープシーケンスが必要。エスケープしないとsyntax errorとなる。
$ ./hello.sh
8
5
20
30
- ReadOnlyな定数の定義
#!/bin/bash
readonly FILE_NAME="hello.sh"
FILE_NAME="hello2.sh"
$ ./hello.sh
./hello.sh: line 11: FILE_NAME: readonly variable
** 配列を使ってみよう [#q4488436]
#!/bin/bash
a=(2 4 6)
echo $a # 配列aの先頭の要素
echo ${a[1]} # 配列aの2番目の要素
echo ${a[@]} # 配列aの全ての要素
echo ${#a[@]} # 配列aの要素数
$ ./hello.sh
2
4
2 4 6
3
#!/bin/bash
a=(2 4 6)
# 配列の要素を変更する
a[2]=10
echo ${a[@]}
# 配列の要素を追加する
a+=(20 30)
echo ${a[@]}
$ ./hello.sh
2 4 10
2 4 10 20 30
#!/bin/bash
# dateコマンドの結果を表示する
d=(`date`)
echo ${d[3]}
$ date
Wed May 4 06:46:44 CEST 2016
$ ./hello.sh
06:47:01
** 条件式を評価してみよう [#d4e6e86b]
- シェルスクリプトの条件式評価は正常終了(0)したかどうかを判定するのが一般的
- 数値の評価
#!/bin/bash
test 1 -eq 2; echo $?
# "$?"は直前に行った条件式が正常終了したかを返す
$ ./hello.sh
1
#!/bin/bash
test 1 -eq 1; echo $?
$ ./hello.sh
0
- 演算子一覧
# 数値
# -eq ... equal (等号)
# -ne ... not equal (不等号)
# -gt ... greater than (より大きい)
# -ge ... greater than or equal (以上)
# -lt ... less than (より小さい)
# -le ... less than or equal (以下)
# 文字列
# = ... equal
# != ... not equal
# ファイル
# -nt ... newer than (より新しい)
# -ot ... older than (より古い)
# -e ... exit (存在するかどうか)
# -d ... directory (ディレクトリかどうか)
test -e hello.sh; echo $? # 0が返る
# 論理演算子
# -a ... and
# -o ... or
# ! ... not
test 1 -eq 1 -a 2 -eq 2; echo $? # 0が返る
** if文で条件分岐をしてみよう [#r1a3c148]
#!/bin/bash
x=70
if test $x -gt 60 # testは[]で置き換え可
then
echo "ok!"
elif [ $x -gt 40 ]; then
echo "soso..."
else
echo "ng..."
fi
#!/bin/bash
x=70
if [ $x -gt 60 ]; then # testを[]で置き換えた記法
echo "ok!"
elif [ $x -gt 40 ]; then
echo "soso..."
else
echo "ng..."
fi
$ ./hello.sh
ok!
** case文で条件分岐をしてみよう [#p8cb39ba]
signal="red"
case $signal in
"red")
echo "stop!"
;;
"yellow")
echo "caution!"
;;
"green")
echo "go!"
;;
*) # 上記の何れにも該当しない場合
echo "..."
;;
esac
** while文でループ処理をしてみよう [#a77a539a]
i=0
while [ $i -lt 10 ]
do
i=`expr $i + 1`
echo $i
done
$ ./hello.sh
1
2
3
4
5
6
7
8
9
10
- ループを抜ける
i=0
while : # 無限ループ
do
i=`expr $i + 1`
if [ $i -eq 3 ]; then
continue
fi
if [ $i -gt 10 ]; then
break
fi
echo $i
done
$ ./hello.sh
1
2
4
5
6
7
8
9
10
** for文でループ処理をしてみよう [#n5b386e1]
for i in 1 2 3 4 5
do
echo $i
done
- 配列と合わせて使う
a=(1 2 3 4 5)
for i in ${a[@]}
do
echo $i
done
- 数値を範囲指定して順次処理する
for i in `seq 1 100` # 1〜100まで
do
echo $i
done