1

我正在 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

4

2 回答 2

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,不!:)

于 2013-03-02T00:23:46.263 回答
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并返回真/假。

样本输出:

$ ./scr 1
from 1-5: 1

$ ./scr 7
invalid : 7

$ ./scr 23
from 16-24: : 23
于 2013-03-02T08:50:45.997 回答