It turns out that iptables doesn't handle leading zeros too well. As $machinenumber
that is used has to have a leading zero in it for other purposes, the idea is simply to create a new variable ($nozero
) based on $machinenumber
, where leading zeros are stripped away.
$machinenumber
is a two-digit number between 01 and 24. Currently it's 09
$machinetype
is 74 for now and hasn't caused any problems before.
What I have so far is:
nozero = (echo $machinenumber | sed 's/^0*//')
iptables -t nat -I POSTROUTING -s 10.($machinetype).($nozero).0/24 -j MASQUERADE
While I believe I'm on the right track, the code results in:
ERROR - Unknown string operation
You don't need to use sed
or another external utility. Here are a couple of ways Bash can strip the leading zeros for you.
iptables -t nat -I POSTROUTING -s "10.$machinetype.$((10#$machinenumber)).0/24" -j MASQUERADE
The $(())
sets up an arithmetic context and the 10#
converts the number from base 10 to base 10 causing any leading zeros to be dropped.
shopt -s extglob
iptables -t nat -I POSTROUTING -s "10.$machinetype.${machinenumber##+(0)}.0/24" -j MASQUERADE
When extglob
is turned on, the parameter expansion shown removes all leading zeros. Unfortunately, if the original value is 0, the result is a null string.