第5章 式と算術式
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
bashには、同じことを行うためのさまざまな方法があり、まったく異なることを行うためのほとんど同じ構文もある。 多くの場合、それはいくつかの特殊文字の違いにすぎない。${VAR} と${#VAR} はすでに見たが、最初の式は変数の値を返すが、2番目はその文字列の長さを返す(「変数の参照」)。 また、${VAR[@]} と${VAR[*]} の引用符の違いもある(「引用符とスペース」)。
角括弧を2つ使うべきか、1つだけ使うべきか、あるいは使わないべきか。 (( ... )) 」と「$(( ... )) 」の違いは何だろう? 通常、記号にはさまざまな使い方に共通する意味があり、それが構文の背後にある理由のようなものを示唆している。 歴史的な理由からこのような表現が選ばれることもある。 これらの慣用的なパターンや算術式について説明できるかどうか、見てみよう。
整数のみ
bashシェルは整数演算しか使わない。その主な用途は、反復計算、ファイル点数、バイト単位でのサイズなどのカウントである。 浮動小数点数の計算が必要な場合はどうすればいいのだろうか?結局のところ、sleepコマンドは小数値を使えるようになった。sleep 0.25 は1/4秒スリープする。1/4秒の倍数スリープしたい場合はどうすればいいのだろうか?sleep $(( 6 * 0.25 )) と書きたいところだが、それはうまくいかない。
最も簡単な解決策は、bc やawk のような別のプログラミングを使って計算を行うことである。例えば、fp というスクリプトがあるので、~/bin ディレクトリか、PATH のどこかに置くことができる(そして実行権限を与える):
# /bin/bash -# fp - provide floating point, via awk# usage: fp "expression"awk"BEGIN { print$*}"
これがあれば、sleep $(fp "6 * 0.25") 、目的の浮動小数点計算を行うことができる。計算を行うのはbashではないかもしれないが、計算を行うのを手助けしてくれるのはbashなのだ。
算術
bashは主に文字列指向の言語だが、bashで二重括弧を見かけるときはいつも、文字列ではなく整数で算術評価が行われていることを意味している。 これは、二重括弧を使ったfor ループのバリエーションでおなじみだ:
for((i=0;i<size;i++))
二重括弧の中の変数名の前に$ を使う必要がないことに注目してほしい。bashで二重括弧を使うときはいつもそうだ。では、二重括弧が使われている場所は他にあるのだろうか?
まず、ドル記号と二重括弧を使って算術計算を行い、シェル変数の値を作成する:
max=$((intro+body+outro-1))median_loc=$((len/2))
繰り返しになるが、変数が二重括弧の中で使われている場合、その前にドル記号を参照する必要がないことに注目してほしい。
次に、この二重括弧の使い方を考えてみよう:
if((max -3> x *4));then# Do something herefi
今回はドル記号を先頭に付けずにダブルペアレンを使用する。 なぜか?何が違うのか?
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access