僕がやってるbashの書き方まとめ

  • URLをコピーしました!

どの言語よりも実はbashを書くのが得意かもしれない僕が、普段やっているbashの書き方をまとめておきます。
備忘録兼bash使いのみなさんへの共有メモとしてこの記事を書かせてもらいます。

随時、思いついたらこの記事は更新していくのでブックマークなんかしておくと便利かも!?知れないぞ。

では、早速ですがいろいろとまとめておきます。

目次

bashの比較演算子

こんなの基本でしょ。ってbash使いの方から怒られるかも知れませんがまとめておきます。
bashの比較演算子は少し特殊ということと、普段C言語pythonでコーディングをしているとbashの比較演算子ってどうやって書くっけ??ってなってしまうので備忘録。

数値の比較をしたい場合は以下の記法です。

数値比較演算子意味他の言語での記法
A -eq BAとBが等しければ真A == B
A -ne BAとBが等しくなければ真A != B
A -ge BAがB以上ならば真A >= B
A -gt BAがBよりも大きければ真A > B
A -le BAがB以下ならば真A <= B
A -lt BAがB未満ならば真A < B
bash数値比較演算子

つい==とか!=とか>=, <=を使いたくなるが、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の複数条件分岐

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

しかし、andorの条件比較を複数組み合わせて行う書き方にはコツがいる。
以下の様に(悪い記述法)書くと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でもファイルの読み込みができるのは意外と役立ちますね。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次