[Linux][bash] 条件判断と演算子

テーマ:
ひさびさに。
しっかしbashなのにテーマlinuxにいれて結構記事も増えてきてあれだな。
最初bashのことこんなに書くつもりなかったからlinuxにまとめちゃったんだけど。

とりあえずtestコマンドで条件判断できるよ!
result countで結果みてみる。
$ test "foo" == "foo";echo $?
0
$ test "foo" == "bar";echo $?
1

こうなります。
こうともいうね。
$ test "foo" != "bar";echo $?
0


数値の大小比較はどうしよう。>とか使うとファイルできちゃうしね。
数値比較の場合はtestコマンドのオプションで表現できる。
$ test 10 -eq 10;echo $?
0
$ test 10 -ne 10;echo $?
1
$ test 10 -gt 5;echo $?
0
$ test 10 -lt 5;echo $?
1
$ test 10 -ge 10;echo $?
0
$ test 10 -le 10;echo $?
0


ということで==と-eqは違う。
$ test 10 == 10;echo $?
0
$ test 10 -eq 10;echo $?
0
$ test "hoge" == "hoge";echo $?
0
$ test "hoge" -eq "hoge";echo $?
-bash: test: hoge: integer expression expected
2

bashの変数は基本文字列だってことがよくわかる。

もちろん論理和とか論理積もつかえる。
$ test 1 == 1 -a 2 == 4;echo $?
1
$ test 1 == 1 -o 2 == 4;echo $?
0
$ test ! 1 == 1 -o 2 == 4;echo $?
1


ちょっとひさびさだし今日は眠いのでこのくらいで。
しっかしlivedoorのIRCサーバ提供はかっこいいね。
現実がどうあれ、事業判断ってところに収益と顧客満足度しかものさしがないとすれば
哀しいと思うんだ。やっぱり。
AD

[Linux][bash] bashでの変数の扱い

テーマ:
bashでの変数は宣言とか特に必要なくて、
参照時に変数名の頭に$をつける。
代入時は$いらなくて、=で代入だけどスペースはあけない。
使える文字は[0-9a-zA-Z_]。
$1,$2,...$nは特殊な変数でコマンド引数を参照できる。
$?は直前のコマンドの終了ステータスを返す。

ってのは超常識か。

実は$nとか$?以外にも特殊な変数がある。
#!/bin/sh
echo "\$0>"$0
echo "\$1>"$1
echo "\$*>"$*
echo "\$#>"$#
echo "\$$>"$$

$0は実行したコマンド。
$*は引数全部。
$#は引数の数。
$$はプロセスID。

実行してみるとこんなかんじ。
$ ./shtest02.sh foo bar hoge baka
$0>./shtest02.sh
$1>foo
$*>foo bar hoge baka
$#>4
$$>39410


この$0はちょっと注意が必要で、スクリプト名とかじゃなくてあくまで実行コマンド。
↑だと普通に相対パスで実行してっけど、仮にパスが通ってる場所で直接実行した場合は
shtest02.shってなるし、test02っていうシンボリックリンク張ってたらtest02って出る。
注意点としてbashコマンドで実行してもbashとはならずにshtest02.shが表示される。


あと変数のスコープ。
↑のように普通に代入しただけの変数はそのシェルのみで有効。
ちなみにそのシェルで存在する変数を確認するにはsetコマンド。
そのシェルに限定されない環境変数として存在する変数を確認するにはprintenvを使う。
$ cat shtest03.sh 
#!/bin/sh
VAL="hoge"
echo "val = "${VAL}
echo "set>"
set | grep 'VAL'
echo "printenv>"
printenv |grep 'VAL'

実行するとこうなる。
$ ./shtest03.sh 
val = hoge
set>
VAL=hoge
printenv>

printenvしてもVALの値がないことがわかる。
環境変数に反映させたい場合はexportを使う。
$ cat shtest03.sh 
#!/bin/sh
VAL="hoge"
export VAL
echo "val = "${VAL}
echo "set>"
set | grep 'VAL'
echo "printenv>"
printenv |grep 'VAL'

$ ./shtest03.sh 
val = hoge
set>
VAL=hoge
printenv>
VAL=hoge

表示されましたね!
ちなみにexport $VALとするとprintenvしても出てこないが普通にecho $VALすると値が表示される。これどういう状況なんだろう。。
AD

[Linux] bashで入力待ち

テーマ:
なんかすごい基本っぽいが実際に使ったことないな。
bashで対話的に入力読み取りするにはreadを使う。

#!/bin/sh
echo -n "who are you ?> "
read INPUT
echo "your name is "$INPUT


ちなみにechoにnオプションつけると行末に改行コードを出力しなくなる。
実行してみるとこんなかんじ。

$ ./shtest.sh 
who are you ?> 東郷平八郎
your name is 東郷平八郎


坂の上の雲おもしれーっす
AD