将值与bash脚本中的多个范围进行比较,并根据该匹配设置其他变量

时间:2013-03-02 00:13:45

标签: string bash

我在bash中设置一个脚本,在一个部分中接收ip并基于该ip确定其他网络设置。 这就是我所拥有的

if[ 1 <= $net <= 5]
then
    network=10.1.0.0
    netmask=255.255.248.0
    gateway=10.1.0.1
elif[16 <= $net <= 23]
then
    network=10.1.16.0
    netmask=255.255.248.0
    gateway=10.1.16.1

elif[24 <= $net <= 31]
then
    network=10.1.24.0
    netmask=255.255.248.0
    gateway=10.1.24.1
elif[32 <= $net <= 39]
then
    network=10.1.32.0
    netmask=255.255.248.0
    gateway=10.1.32.1

..............(它会持续一段时间。

使用案例或其他方式有更好的方法吗?

我也不确定我是否正确地做了IF语句。

提前致谢。

编辑:我想我忘了提到IP地址来自“读取”输入,然后剪切以获取值。

IE用户输入10.1.40.207希望然后通过管道传输来获取$ net = 40

2 个答案:

答案 0 :(得分:3)

直接设置值:

network=10.1.$(($net/8*8)).0
netmask=255.255.248.0
gateway=10.1.$(($net/8*8)).1

我已经在步骤中发布了一个解释,说明了如何将代码简化为以上4个步骤:http://paste.ubuntu.com/5585785/

“魔法”在数学中。一些小数学可以防止任何条件的需要。没有case,没有if s,没有但是! :)

答案 1 :(得分:1)

如果可以直接计算这些值(如其他答案中所示),则会消除大量脚本;但是,您可能仍需要检查有效/无效输入;但也可以使用扩展的if / elif / else / fi完成。

但是要回答这个问题,这里有一个if / else可以检查数字的范围(我不认为'案例'会简化问题):

#!/bin/bash

arg=$1

if  ((  1 <= arg && arg <= 5 )) ; then
  echo "from 1-5: $arg"
elif (( 16 <= arg && arg <= 23 )) ; then
  echo "from 16-23: : $arg"
elif (( 24 <= arg && arg <= 31 )) ; then
  echo "from 24-31: : $arg"
else
  echo "invalid : $arg"
fi

重点是((...))用于算术评估,而不是[..];它相当于let并返回true / false。

示例输出:

$ ./scr 1
from 1-5: 1

$ ./scr 7
invalid : 7

$ ./scr 23
from 16-24: : 23