Edited at

本当は使いたいけど使わないBashのTIPS

More than 5 years have passed since last update.


本当は使いたいんだけどねー

仕事だとベンダーの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 という配列変数 にマッチした部分文字列が格納されます。

何だこれは?便利じゃないか。


hoge.sh

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