事实证明,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
Run Code Online (Sandbox Code Playgroud)
虽然我相信我走在正确的轨道上,但代码导致:
ERROR - Unknown string operation
Run Code Online (Sandbox Code Playgroud)
Pau*_*ce. 56
您不需要使用sed
或使用其他外部实用程序.以下两种方式Bash可以为您删除前导零.
iptables -t nat -I POSTROUTING -s "10.$machinetype.$((10#$machinenumber)).0/24" -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
在$(())
设置了一个算术上下文和10#
将从基座10的数量为10进制引起任何前导零被丢弃.
shopt -s extglob
iptables -t nat -I POSTROUTING -s "10.$machinetype.${machinenumber##+(0)}.0/24" -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
当extglob
被接通时,所示的参数扩展去除所有的前导零.不幸的是,如果原始值为0,则结果为空字符串.
Igo*_*bin 22
不,你让所有(alomost all)正确.你必须:
=
$()
或反叛而不是()
这是正确的:
nozero=$(echo $machinenumber | sed 's/^0*//')
Run Code Online (Sandbox Code Playgroud)
你也必须使用不在()
它们周围的变量.您可以""
根据需要添加:
iptables -t nat -I POSTROUTING -s "10.$machinetype.$nozero.0/24" -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
当然,这里的变量不是必需的.你可以简单地说:
iptables -t nat -I POSTROUTING -s "10.$(echo $machinenumber | sed 's/^0*//').$nozero.0/24" -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)
小智 9
我不能评论,因为我没有足够的声誉,但我建议你接受丹尼斯的答案(这真的很整洁)
首先,我不认为你的答案是有效的bash.在我的安装中,我得到:
> machinetype=74
> machinenumber=05
> iptables -t nat -I POSTROUTING -s 10.($machinetype).($machinenumber + 0).0/24 -j MASQUERADE
-bash: syntax error near unexpected token `('
> echo 10.($machinetype).($machinenumber + 0).0/24
-bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)
如果我引用它,我得到:
> echo "($machinetype).($machinenumber + 0)"
(74).(05 + 0)
Run Code Online (Sandbox Code Playgroud)
我假设你的意思是:
> echo 10.$(($machinetype)).$(($machinenumber + 0)).0/24
10.74.5.0/24
Run Code Online (Sandbox Code Playgroud)
但是,当然,由于八进制,它仍然是一个糟糕的解决方案:
> machinenumber=09
> echo 10.$(($machinetype)).$(($machinenumber + 0)).0/24
-bash: 09: value too great for base (error token is "09")
Run Code Online (Sandbox Code Playgroud)
我认为你的号码目前不是08或09.
这是丹尼斯的:
> echo $((10#09))
9
> echo $((10#00))
0
> echo $((10#00005))
5
> echo $((10#))
0
Run Code Online (Sandbox Code Playgroud)
不可否认,最后一个可能是某人的输入验证问题.
sed解决方案的问题是:
> echo "0" | sed 's/^0*//'
>
Run Code Online (Sandbox Code Playgroud)
nozero=$(echo $machinenumber | sed 's/^0*//')
Run Code Online (Sandbox Code Playgroud)
尝试没有周围的空间=
和额外的$
标志.
小智 6
将数字加 0,它将删除前导零
eg: expr 00010 + 0 #becomes 10
Run Code Online (Sandbox Code Playgroud)
或者
num=00076
num=${num##+(0)}
echo $num
Run Code Online (Sandbox Code Playgroud)
纯粹的bash解决方案:
> N=0001023450
> [[ $N =~ "0*(.*)" ]] && N=${BASH_REMATCH[1]}
> echo $N
1023450
Run Code Online (Sandbox Code Playgroud)
使用 sed:
echo 000498 | sed "s/^0*\([1-9]\)/\1/;s/^0*$/0/"
498
echo 000 | sed "s/^0*\([1-9]\)/\1/;s/^0*$/0/"
0
Run Code Online (Sandbox Code Playgroud)