LoginSignup
107
105

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-05-26

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

仕事だとベンダーの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

107
105
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
107
105