本当は使いたいんだけどねー
仕事だとベンダーのUNIXサーバーが多いのでbashがなかったりします。
HP-UXとかマジに死んで欲しい。Solaris11は大好きです。
##環境
- CentOS 6.5
- bash version 4.1.2
##LINENO変数とFUNCNAME変数
本当にbashが羨ましい。HP-UXやAIXも何故bashを標準で搭載してくれないのだろう。
#!/bin/bash
func1() {
echo ${FUNCNAME}:${LINENO}
}
sub1() {
echo ${FUNCNAME}:${LINENO}
}
func1
sub1
$ ./foo.sh
func1:3
sub1:6
##PIPESTATUS変数
パイプでコマンドを連結したとき、コマンドステータスは最後のコマンドしか取得することができません。
bashだとPIPESTATUS変数があるよね。
ret3() { return 3; }
ret4() { return 4; }
true | false | ret3 | ret4
echo ${PIPESTATUS[@]}
0 1 3 4
##算術式評価
i++ や i+=10 とかできる。
i=0
echo $i
0
: $((i++))
echo $i
1
echo $((++i))
2
echo $((i+=10))
12
なんてことでしょう。C言語っぽい書き方も可能です。でもこれは使わないからいいや。
for (( i=0 ; i<5 ; i++ )) ; do
echo $i
done
$ ./foo.sh
0
1
2
3
4
##複合コマンド [[
これが超便利。
このような変数に値がない状態だとダサい結果になる。
shだと一度チェックして対応することが多いです。あーいやだ。
x=
y=hoge
[ $x = $y ] || echo "fail"
-bash: [: =: unary operator expected
fail
# こんなチェックはダサいよね。
[ "x${x}" = "x" ] && (echo "x is empty"; exit 1)
[ "x${x}" = "x" ] && x=default
[[ を使うと少しだけ幸せになれます。
x=
y=hoge
[[ $x = $y ]] || echo "fail"
fail
もちろん、ダブルクォートで括ってあげたり、パラメータ展開を使う方法もあります。
x=
y=hoge
[ "$x" = "$y" ] || echo "fail"
fail
[ ${x:=default} = $y ] || echo "fail"
fail
##正規表現
=~ オペレーターを使うと正規表現が使えます。 [ expression ] はだめ。 [[ expression ]] にしてください。
[[ $url =~ htp:// ]]
echo $?
1
[[ $url =~ http:// ]]
echo $?
0
正規表現を使うと BASH_REMATCH という配列変数 にマッチした部分文字列が格納されます。
何だこれは?便利じゃないか。
regexp="(http:/+)(w{3}.*com)"
url=http://www.google.com
[[ $url =~ $regexp ]]
echo ${BASH_REMATCH[0]}
echo ${BASH_REMATCH[1]}
echo ${BASH_REMATCH[2]}
./hoge.sh
http://www.google.com
http://
www.google.com
参考URL
ここ見れば全て書いてある。
http://linuxjm.sourceforge.jp/html/GNU_bash/man1/bash.1.html