【コラム】

漢のzsh

8 これは既にシェルを超えている…… zshの算術演算

 

8/24

ひと味違うzshの算術演算

ごくまれに、シェルスクリプトで算術計算をしたいことがある。そんなときにもzshは強力だ。今週はbashやtcshとはひと味違う高機能を紹介する。

zshでの算術演算は(( ))で指定する。プロンプト1.1のように記載すれば、answerに加算結果が代入される。なおこれはプロンプト1.2とかプロンプト1.3のように$(( ))で記述してもいい。(( ))なら算術演算を、$(( ))なら算術演算のあとの値を評価対象として扱うようになる。

プロンプト1.1 zshの算術演算は(( ))で指定。(( ))の中はCやJavaのように算術式を記載できる

% (( answer = 1 + 2 + 3 + 4 + 5 ))
% echo $answer
15

プロンプト1.2 (( ))ではなく$(( ))を使えば算術結果が評価対象になる

% echo $(( answer = 1 + 2 + 3 + 4 + 5 ))
15

プロンプト1.3 もちろんこういう書き方もできる

% echo $(( 1 + 2 + 3 + 4 + 5 ))
15

ここまでならtcsh/bashと大きな違いもないが、ここからがひと味違う。bash/tcshの提供している算術演算は整数しか扱えない。しかし、zshでは整数と実数の両方に対応している。最初に整数が代入されれば整数の変数として、最初に実数が代入されれば実数の変数として扱われる。たとえばプロンプト1.4は最初に整数が代入されているので、実数は切捨てられて整数が代入されている。プロンプト1.5のように最初から実数を代入すれば実数として扱われる。

プロンプト1.4 最初に整数を代入すれば整数用の変数として機能する

% (( answer = 1 + 2 + 3 + 4 + 5 ))
% (( answer = 1.2345))            
% echo $answer
1

プロンプト1.5 最初に実数を代入すれば実数用の変数になる

% unset answer
% (( answer = 1.2345 ))    
% echo $answer
1.2345000000

変数の種類を明示したければ使う前に(( x = 0 ))や(( x = 0.0 ))のように代入しておけばいい。実数が使えるとプログラミングの幅もぐっと広くなる。さすがzsh。

数値処理をおこなう関数まで

さらに、数値処理をおこなう関数まで存在する。リスト2.1のようにmathfuncモジュールを読み込めば利用可能だ。これは既にインタラクティブシェルというよりはプログラミング言語の領域……

リスト2.1 mathfuncモジュールを読み込むと数値処理関数も使える。これはほんとうにシェルなんだろうか

#!/usr/local/bin/zsh

# load math functions
zmodload -i zsh/mathfunc

echo $(( sin(1) ))

プロンプト2.2 zshでsin関数を使った演算を実施した場合

% ./sin.zsh 
0.8414709848078965

まるでC/Java 繰り返し構文も

実数が扱えるので、for構文もCやJavaのような記述ができる。リスト3.1のように記載すれば、プロンプト3.2のような結果が得られるわけだ。ちょっとしたデータ処理ならプログラムを書く必要もなく、zshでちょちょいと処理できる。

リスト3.1 C/Javaのfor構文のような使いかたもできる

#!/usr/local/bin/zsh

for ((count = 0.0; count < 1.0; count += 0.05))
do
    echo $count
done

プロンプト3.2 実行すればこんな感じだ

% ./formath.zsh
0.0000000000
0.0500000000
0.1000000000
0.1500000000
0.2000000000
0.2500000000
0.3000000000
0.3500000000
0.4000000000
0.4500000000
0.5000000000
0.5500000000
0.6000000000
0.6500000000
0.7000000000
0.7500000000
0.8000000000
0.8500000000
0.9000000000
0.9500000000

ただし、ただの繰り返し構文として使うならリスト3.1のように使う必要はなく、リスト3.3のように書けばいい。

リスト3.3 ただの繰り返し構文が必要ならわざわざ実数計算を使う必要はない

#!/usr/local/bin/zsh

for target in {0..10}
do
    echo $target
done

プロンプト3.4 実行するとこんな感じだ

% ./for.zsh
0
1
2
3
4
5
6
7
8
9
10

zshで「プログラミング」してみる

ということで、zshだけで数値計算プログラムのようなものを作成できる。sin曲線を描画するスクリプトを作成したので掲載しておこう。この程度ならzshでサクサク記述できる。zsh、これはなかなかあなどれない。

リスト4.1 zshでsin曲線を記述するスクリプト

#!/usr/local/bin/zsh

# load math functions
zmodload -i zsh/mathfunc

# configurations
(( pi = 3.14159265358979323846 ))
(( termwidth = 60 ))

# clear line buffer
set -A termbuffer
cleartermbuffer()
{
    for ((index = 1; index < termwidth + 1; index++))
    do
        termbuffer[index]=" "
    done
    termbuffer[$((termwidth / 2))]="|"
}

# plot line buffer
plotbuffer()
{
    for (( index = 1; index < termwidth + 1; index++ ))
    do
        echo -n $termbuffer[index]
    done
    echo
}

# plot sin
for (( count = 0.0; count < 2.0 * pi; count += 0.1 ))
do
    (( xpoint = (sin(count) + 1.0) * (termwidth / 2.0) ))

    cleartermbuffer
    termbuffer[xpoint]="*"
    plotbuffer
done

プロンプト4.2 記述されたsin曲線

s% ./plotsin.zsh
                             *                              
                             | *                            
                             |    *                         
                             |       *                      
                             |          *                   
                             |             *                
                             |               *              
                             |                  *           
                             |                    *         
                             |                      *       
                             |                        *     
                             |                         *    
                             |                          *   
                             |                           *  
                             |                            * 
                             |                            * 
                             |                            * 
                             |                            * 
                             |                            * 
                             |                           *  
                             |                          *   
                             |                        *     
                             |                       *      
                             |                     *        
                             |                   *          
                             |                *             
                             |              *               
                             |           *                  
                             |         *                    
                             |      *                       
                             |   *                          
                             |*                             
                           * |                              
                        *    |                              
                     *       |                              
                  *          |                              
               *             |                              
             *               |                              
          *                  |                              
        *                    |                              
      *                      |                              
    *                        |                              
  *                          |                              
 *                           |                              
*                            |                              
*                            |                              
*                            |                              
*                            |                              
*                            |                              
*                            |                              
*                            |                              
 *                           |                              
  *                          |                              
    *                        |                              
     *                       |                              
       *                     |                              
          *                  |                              
            *                |                              
               *             |                              
                 *           |                              
                    *        |                              
                       *     |                              
                          *  |                              
%

8/24

インデックス

連載目次
第24回 グッバイ野郎ども! コピペではじめるzshファイナル
第23回 コマンド補完設定 - アーキテクチャタイプ編
第22回 もってけ泥棒! コピペで始めるzsh - リターンズ
第21回 コマンド補完設定 - ファイルシステムタイプ編
第20回 コマンド補完設定 - cal/ncalコマンド編
第19回 コマンド補完設定 - trafshowコマンド編
第18回 コマンド補完設定 - daemonコマンド編(2)
第17回 コマンド補完設定 - daemonコマンド編(1)
第16回 拡張子ごとにコマンドを自動実行 - 「alias -s」
第15回 **で簡単ヒット!!! - 漢達への熱いお願い付き
第14回 zshとscreenで最強のターミナル環境
第13回 タブキーは最強だ - ファイルグロブもサクっと展開
第12回 一時ファイルはもういらない - プロセス置換
第11回 zshはエディタか? - 「zed」でお手軽編集
第10回 もってけ泥棒! コピペで始めるzsh
第9回 世界はモノクロからカラーへ
第8回 これは既にシェルを超えている…… zshの算術演算
第7回 ひと味違うzshのリダイレクト
第6回 漢はだまって先方予測 - あなたはこの機能使いこなせるか
第5回 「あーっ!」というそのときのために - 備えあれば憂いなしの設定集
第4回 コマンド履歴の検索~EmacsとVi、どっちも設定できるぜzsh
第3回 同じことを2度するなんて…… 自分の過去は利用しましょう
第2回 取りあえず、プロンプトを整えておく。カッコつけたいからね
第1回 最強のシェル、それは「zsh」

もっと見る



転職ノウハウ

あなたが本領発揮できる仕事を診断
あなたの仕事適性診断

シゴト性格・弱点が20の質問でサクッと分かる!

「仕事辞めたい……」その理由は?
「仕事辞めたい……」その理由は?

71%の人が仕事を辞めたいと思った経験あり。その理由と対処法は?

3年後の年収どうなる? 年収予報
3年後の年収どうなる? 年収予報

今の年収は適正? 3年後は? あなたの年収をデータに基づき予報します。

激務な職場を辞めたいが、美女が邪魔して辞められない
激務な職場を辞めたいが、美女が邪魔して辞められない

美人上司と可愛い過ぎる後輩に挟まれるエンジニアの悩み

人気記事

一覧

イチオシ記事

新着記事

ジェットスター・ジャパン、初の通期黒字化--中国本土など国際線拡大へ
[17:26 8/24] 趣味
スマイルワークスのクラウド給与計算ソフト、中堅企業向けに機能を強化
[17:25 8/24] 企業IT
朝食市場、活性化の鍵はカギはどの世代?
[17:24 8/24] マネー
高畑裕太容疑者出演ドラマ『侠飯』一部撮り直しに - 26日放送分から編集
[17:08 8/24] エンタメ
MSI、OC版Radeon RX 480搭載グラフィックスカード - 税別34,980円
[17:07 8/24] パソコン

求人情報