どの言語よりも実はbashを書くのが得意かもしれない僕が、普段やっているbashの書き方をまとめておきます。
備忘録兼bash使いのみなさんへの共有メモとしてこの記事を書かせてもらいます。
随時、思いついたらこの記事は更新していくのでブックマークなんかしておくと便利かも!?知れないぞ。
では、早速ですがいろいろとまとめておきます。
bashの比較演算子
こんなの基本でしょ。ってbash使いの方から怒られるかも知れませんがまとめておきます。
bashの比較演算子は少し特殊ということと、普段C言語やpythonでコーディングをしているとbashの比較演算子ってどうやって書くっけ??ってなってしまうので備忘録。
数値の比較をしたい場合は以下の記法です。
数値比較演算子 | 意味 | 他の言語での記法 |
A -eq B | AとBが等しければ真 | A == B |
A -ne B | AとBが等しくなければ真 | A != B |
A -ge B | AがB以上ならば真 | A >= B |
A -gt B | AがBよりも大きければ真 | A > B |
A -le B | AがB以下ならば真 | A <= B |
A -lt B | AがB未満ならば真 | A < B |
つい==
とか!=
とか>=
, <=
を使いたくなるが、bashではそうはいかない。
意味を知ってれば比較的覚えやすいかも
- eq:equal to
- ge:greater than or equal to
- gt:greater than
- le:less than or equal to
- lt:less than
- ne:not equal to
文字列の比較をしたい場合は以下の記法です。
文字列比較演算子 | 意味 | 他の言語での記法 |
"A" = "B" | AとBが等しければ真 | "A" == "B" |
"A" != "B" | AとBが等しくなければ真 | "A" != "B" |
"A" | 文字列の長さが0より大きければ真 | sizeof(&A) > 0, len("A") > 0, etc.. |
-n "A" | 文字列の長さが0より大きければ真 | sizeof(&A) > 0, len("A") > 0, etc.. |
!"A" | 文字列の長さが0であれば真 | sizeof(&A) == 0, len("A") == 0, etc.. |
-z "A" | 文字列の長さが0であれば真 | sizeof(&A) == 0, len("A") == 0, etc.. |
bashの複数条件分岐
bashの条件分岐の書き方は基礎中の基礎なので割愛しますが、ここでは複数条件分岐の記法をまとめておきます。
有名な条件分岐に使うのは&&(and)
とか||(or)
ですね。
bashのand条件
例)AがBと等しいかつAがC以上ならば...
if [ A -eq B -a A -ge C ]; then
条件式にandを使いたい場合は-a
を使う。
または、こんな書き方もできる。
if [ A -eq B ] && [ A -ge C ]; then
bashのor条件
例)AがBと等しいまたはAがC以下ならば...
if [ A -eq B -o A -le C ]; then
条件式にorを使いたい場合は-o
を使う。
または、こんな書き方もできる。
if [ A -eq B ] || [ A -ge C ]; then
bashの複数条件分岐(応用)
複数条件分岐の書き方は以下のように書けば、多くの条件比較が可能である。
if [ A -eq B ] && [ A -ge C ] && [ A -ge D ] && [ A -ne E ]; then
しかし、and
とor
の条件比較を複数組み合わせて行う書き方にはコツがいる。
以下の様に(悪い記述法)書くとandとorがどれにかかってるかよくわからない。
#こんなふうに書くとandとorの範囲が意図したように動作しない
if [ A -eq B ] && [ A -ge C ] || [ A -ge D ] && [ A -ne E ]; then
...ということで
僕は複数の条件比較(andとorを駆使する)を行う場合はこのように書いている。
if [ A -eq B -a A -ge C ] || [ A -ge D -a A -ne E ]; then
bashの変数をインクリメント
bashでカウンターなんかを実装するときに便利です。算術式$(( ~ ))
というものを使っていきます。
count=0
while [ $count -lt 100 ];
do
count=$(( count + 1 )) # count をインクリメント
done
算術式$(( ~ ))
を使えばインクリメント以外にも変数の和差積商を扱うこともできます。
hoge=20
foo=10
huga=$(( $hoge + $foo )) #30
huga=$(( $hoge - $foo )) #10
huga=$(( $hoge * $foo )) #200
huga=$(( $hoge / $foo )) #2
bashのexprコマンド
他にもexpr
を使って変数の和差積商を行うことができるのですが、
hoge=`expr 100 + 50` #150
以下の記事でexpr
は処理が遅いということが書かれていました。極力算術式$(( ~ ))
を扱うのが良さそうですね。
https://qiita.com/d_nishiyama85/items/a117d59a663cfcdea5e4
bashで直前のコマンドの返り値を取得
bashで直前のコマンドの返り値を取得することで、コマンドが成功した場合に行いたい処理または失敗した場合に行いたい処理等の分岐を行うことができます。これはよく使います。
例えば、ppp接続されているか確認したい場合
ifconfig ppp0 #ppp0確認
ret=$? #ppp0確認の結果を格納
echo $ret #0:ppp0接続OK 1:ppp0接続NG
直前のコマンドの返り値は$?
で取得することができます。
大抵の場合は成功した際は0が戻り値として返され、失敗するとそれ以外が返されます。
コマンドの返り値により処理を変える書き方
コマンドが成功した場合に行いたい処理は&&
に続けて行いたい処理を書きます
コマンドが失敗した場合に行いたい処理は||
に続けて行いたい処理を書きます
ifconfig ppp0 && echo "ppp接続OK" #pppが接続されている場合は OKと出力
ifconfig ppp0 || echo "ppp接続NG" #pppが接続されていない場合は NGと出力
#もちろんまとめて書くこともできます
ifconfig ppp0 && echo "ppp接続" || echo "接続NG" #この場合OKまたはNGが必ず出力される
bashでコマンドの返り値を変数に格納
コマンドの結果をそのまま使いたい場合もあります。
hoge=`ls /home/usr/`
例では、ls
コマンドで得た結果がそのまま変数に格納されます。
パッと見た感じ分かりにくいですが、シングルクォーテーション【'】
ではなくて、バッククォーテーション (バッククォート)【`】
でコマンドを囲うので注意。
bashでファイルの読み込み
ファイルを読み込み1行ずつ処理を行いたい場合の記述方法。少々マニアック気味ではありますが....
例えば以下のように行うべきコマンド処理を記述したファイルがあり、これを順に行いたいというときに便利
mkdir workdir
cd workdir
echo `date` >> test.txt
chmod 755 test.txt
ではこのファイルに記述されているコマンドを実行していきます。
以下のように記述します。
cat command.txt | while read line; do
eval $line
done
するとworkdir
が作成されその中には実行日時の記載されたtest.txt
(権限755)が作成されているはずです。
bashでもファイルの読み込みができるのは意外と役立ちますね。
コメント