Bashの使い方まとめ
特殊変数
変数 |
意味 |
補足 |
$0 |
シェルスクリプト名 |
|
$1-$9 |
1番目~9番目の引数 |
|
$* |
すべての引数 |
"$1 $2 $3" という1つの引数として展開される |
$@ |
すべての引数 |
"$1" "$2" "$3" という複数の引数として展開される |
$# |
引数の数 |
|
$? |
直前に実行したコマンドの終了ステータス |
0は成功、0以外は失敗 |
$- |
シェルの実行オプション |
|
$$ |
シェルのプロセスID |
|
$! |
最後に実行したバックグラウンドプロセスのPID |
|
$_ |
最後に実行したコマンドの最後の引数 |
|
エラー制御
エラーが発生時に終了(set -e
)
#!/bin/bash
set -e
A=a
B=b
C=c
echo $A | grep a
echo $B | grep a
echo $C | grep c
$ bash sete.sh
a
$ echo $?
1
ただし、パイプの最後のコマンドが成功すれば成功とみなされる。
#!/bin/bash
set -e
A=a
B=b
C=c
echo $A | grep a
echo $B | grep a | echo OK
echo $C | grep c
$ bash test.sh
a
OK
c
$ echo $?
0
set -eo pipefail
を指定することで途中のエラーで終了する
#!/bin/bash
set -eo pipefail
A=a
B=b
C=c
echo $A | grep a
echo $B | grep a | echo OK
echo $C | grep c
$ bash test.sh
a
OK
$ echo $?
1
未定義の変数を使用するとエラー(set -u
)
#!/bin/bash
A=1
echo $A
echo $B
set -u
echo $A
echo $B
$ bash setu.sh
1
1
test.sh: 行 7: B: 未割り当ての変数です
$ echo $?
1
変数展開
パラメータ |
意味 |
例 |
結果 |
${VAL} |
VALの値 |
VAL=value; echo ${VAL} |
value |
${VAL:-def} |
VALが未設定ならdef |
unset VAL; echo ${VAL:-value} |
value |
${VAL:=def} |
VALが未設定ならdefを代入 |
unset VAL; echo ${VAL:=value} |
value |
${VAL:3} |
3文字目以降を取得 |
VAL=value; echo ${VAL:3} |
ue |
${VAL:1:2} |
1文字目から2文字取得 |
VAL=value; echo ${VAL:1:2} |
al |
${VAL#pattern} |
最短一致のprefix除去 |
VAL=value; echo ${VAL#va} |
lue |
${VAL##pattern} |
最長一致のprefix除去 |
VAL=value; echo ${VAL##val} |
ue |
${VAL%pattern} |
最短一致のsuffix除去 |
VAL=value.sh; echo ${VAL%.sh} |
value |
${VAL%%pattern} |
最長一致のsuffix除去 |
VAL=value.tar.gz; echo ${VAL%%.gz} |
value.tar |
${!VAL*} |
VALで始まる変数名一覧(ワイルドカード) |
例略 |
|
${#VAL} |
VALの文字数 |
VAL=abc; echo ${#VAL} |
3 |
${VAL/ptn/def} |
ptn部分をdefに1回だけ置換 |
VAL=abcabc; echo ${VAL/a/A} |
Abcabc |
${VAL//ptn/def} |
ptn部分をdefにすべて置換 |
VAL=abcabc; echo ${VAL//a/A} |
AbcAbc |
${VAL^} |
最初の1文字を大文字化 |
VAL=value; echo ${VAL^} |
Value |
${VAL^^} |
すべての文字を大文字化 |
VAL=value; echo ${VAL^^} |
VALUE |
${VAL,} |
最初の1文字を小文字化 |
VAL=Value; echo ${VAL,} |
value |
${VAL,,} |
すべての文字を小文字化 |
VAL=VALUE; echo ${VAL,,} |
value |
引数の解析(getopts
)
while getopts "abc:" opts
do
case $opts in
a)
echo a
;;
b)
echo b
;;
c)
VALUE=${OPTARG}
echo ${VALUE}
;;
esac
done
制御文
if文
VAL=10
if [ $VAL -gt 5 ]; then
echo "5より大きい"
elif [ $VAL -eq 5 ]; then
echo "5と等しい"
else
echo "5より小さい"
fi
case文
FRUIT="apple"
case "$FRUIT" in
"apple")
echo "りんご"
;;
"banana")
echo "バナナ"
;;
*)
echo "その他"
;;
esac
for文(数値)
for i in {1..5}
do
echo "i=$i"
done
for文(配列)
arr=("one" "two" "three")
for item in "${arr[@]}"
do
echo "$item"
done
while文
COUNT=1
while [ $COUNT -le 3 ]
do
echo "COUNT=$COUNT"
COUNT=$((COUNT + 1))
done
until文
VAL=0
until [ $VAL -gt 3 ]
do
echo "VAL=$VAL"
VAL=$((VAL + 1))
done
break / continue
for i in {1..5}
do
if [ $i -eq 3 ]; then
continue # 3はスキップ
fi
if [ $i -eq 5 ]; then
break # 5で終了
fi
echo "i=$i"
done
&& / ||
[ -f "file.txt" ] && echo "ファイルあり" || echo "ファイルなし"