コンテンツにスキップ

bash

シェルオプション

【 set 】コマンド――シェルの設定を確認、変更する:Linux基本コマンドTips(205) - @IT

setや、shebangで#!/bin/bash -uなどでセットする

未定義変数使用時にエラー (-u)

-u (nounset)

[zaki@cloud-dev2 sh]$ cat set.sh 
#!/bin/bash -u

echo $hoge
[zaki@cloud-dev2 sh]$ ./set.sh 
./set.sh: 行 3: hoge: 未割り当ての変数です
[zaki@cloud-dev2 sh]$ export hoge=123
[zaki@cloud-dev2 sh]$ ./set.sh 
123

コマンドと引数を表示 (-x)

$ cat option.sh 
#!/bin/bash -x

ls /
$ ./option.sh 
+ ls /
afs  boot  etc   lib    media  opt   root  sbin  sys  usr
bin  dev   home  lib64  mnt    proc  run   srv   tmp  var

出力の先頭文字は変数PS4で指定。

$ PS4="---" ./option.sh 
---ls /
afs  boot  etc   lib    media  opt   root  sbin  sys  usr
bin  dev   home  lib64  mnt    proc  run   srv   tmp  var

set -* の解除

set -uを解除するにはset +u

算術演算

$ echo $((1 + 3 + 2 + 4 + 3))
13
$ echo $((13 * 2))
26
$ echo $((13 / 3))
4
$ echo $((13 % 3))
1

インクリメント

    count=$((++count))

配列

$ list=("abc" "123" "xyz")
$ echo ${list[1]}
123

関数

引数

#!/bin/bash

function myfunc() {
    echo "function arg1($1) arg2($2)"
}

myfunc a b

戻り値

function myfunc() {
    echo "function arg1($1) arg2($2)"
    return 1
}

myfunc a b
echo $?

制御構文

test/評価

オプション 使用例 説明
-n [ -n string ] 文字列長が非ゼロであればtrue
-z [ -z string ] 文字列長がゼロでればtrue
-e [ -e filename ] ファイルが存在すればtrue
-r [ -r filename ] ファイルの読み取り権限があればtrue
-w [ -w filename ] ファイルの書き込み権限があればtrue
-x [ -x filename ] ファイルの実行権限があればtrue
-eq [ $n -eq 123 ] 数値比較(一致)
-ne [ $n -ne 200 ] 数値比較(不一致)
== [ $s == "abc" ] 文字列比較(一致)
!= [ $s != "xyz" ] 文字列比較(不一致)
  • 文字列一致は = も有効。
  • 文字列の空文字判定は [ $s == "" ] は不可($sが空の場合 [ == "" ]と解釈される)
    • -zを使うか[ "$s" == "" ]と書く

if

if [ -z $value1 ] || [ -z $value2 ]; then
    echo '$value1 or $value2 is not defined'
elif [ -z $value3 ]; then
    echo '$value3 is not defined'
else
    echo OK
fi

ループ

配列要素をループ処理

#!/bin/bash

list=("abc" "123" "xyz")
for item in ${list[@]}; do
  echo $item
done

ループで参照(インデックス)

インデックスが必要であればこちら。

#!/bin/bash

list=("abc" "123" "xyz")
for i in ${!list[@]}; do
  echo ${list[$i]}
done

実行結果は以下の通り。

abc
123
xyz

nからmまで(seq利用)

#!/bin/bash

for i in $(seq 1 3); do
    echo $i
done

実行結果は以下

1
2
3

nからmまで(ブレース)

for i in {1..10}; do
    echo $i
done

whileで無限ループ

while :
do
  # 処理
done

ファイルを1行ずつ

while read line
do
    # ${line}に行が入っている
done < "/path/to/file.txt"

コマンドの結果を1行ずつ

command | filter | while read line
do
    # ${line}の処理
done

途中で抜ける

break

次のループ

continue