zshの数値範囲指定の正規表現を使った


はじめに

シェルスクリプトのCase文で数値の範囲指定が使えないか検索してみたら,Zshの拡張正規表現ではそれが可能ということがわかったので,いろいろ試してみた.

環境

Zsh 5.6.2

使い方

文法

<x-y>

これでx以上y以下の数値を指定できる.Zshのマニュアルによれば,xとyはそれぞれ省略可能,故に<->はあらゆる数にマッチする.

使用例

#!/bin/zsh

foo=5

case "$foo" in
    <0-10> ) echo "aaa" ;;
    <11-20> ) echo "bbb" ;;
    <-> ) echo "ccc" ;;
esac
#=>aaa

temperature=40

case "$temperature" in
    <38-> ) echo "flu" ;;    # 38以上
    <-> ) echo "normal" ;;
esac
#=>flu

age=18

case "$age" in
    <-18> ) echo "child" ;;    #18以下
    <-> ) echo "adult" ;;
esac
#=>child

ちなみに負の数には対応していない模様.

#!/bin/zsh

water_temp=-30

case "$water_temp" in
    <-0> ) echo "solid" ;;
    <1-99> ) echo "liquid" ;;
    <100-> ) echo "gas" ;;
esac
#=>(何も表示されない)

負の数を判別したいなら,次の方法で行うという手がある.

#!/bin/zsh

negative_number=-30

case "$negative_number" in
    -<1-> ) echo "negative." ;;
    0 ) echo "zero." ;;
    <1-> ) echo "positive." ;;
esac
#=>negative.

また,正規表現であるゆえ,使用場面はCase文に限らない([1]).

参考元

[1]zsh で「<>」を使って数値による範囲指定を行う - ablog
https://yohei-a.hatenablog.jp/entry/20090824/1251099682
[2]shell - case + how to implement equal or less or greater in case syntax - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/65310/case-how-to-implement-equal-or-less-or-greater-in-case-syntax