我在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
答案 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