事实证明,iptables不能很好地处理前导零。由于使用的$machinenumber
的其他目的必须带有前导零,因此,该想法只是基于$nozero
创建一个新变量($machinenumber
),在其中删除了前导零。$machinenumber
是介于01和24之间的两位数字。当前为09$machinetype
现在是74,以前没有引起任何问题。
到目前为止,我有:
nozero = (echo $machinenumber | sed 's/^0*//')
iptables -t nat -I POSTROUTING -s 10.($machinetype).($nozero).0/24 -j MASQUERADE
虽然我相信自己的工作方向正确,但代码的结果是:
ERROR - Unknown string operation
最佳答案
您不需要使用sed
或其他外部实用程序。 Bash有几种方法可以为您去除前导零。
iptables -t nat -I POSTROUTING -s "10.$machinetype.$((10#$machinenumber)).0/24" -j MASQUERADE
$(())
设置算术上下文,并且10#
将数字从10转换为10,从而导致任何前导零被丢弃。shopt -s extglob
iptables -t nat -I POSTROUTING -s "10.$machinetype.${machinenumber##+(0)}.0/24" -j MASQUERADE
打开
extglob
时,显示的参数扩展将删除所有前导零。不幸的是,如果原始值为0,则结果为空字符串。关于bash - 在将shell变量传递给另一个命令之前,删除前导零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11123717/