事实证明,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/