在将shell变量传递给另一个命令之前删除前导零

Jar*_*und 40 bash strip

事实证明,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,则结果为空字符串.

  • "10#"是迄今为止我发现的最简单,最优雅的解决方案.谢谢! (13认同)

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)


piz*_*zza 18

你也可以

machinenumber=$(expr $machinenumber + 0)
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)


Bal*_*int 6

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)


use*_*623 5

纯粹的bash解决方案:

> N=0001023450 
> [[ $N =~ "0*(.*)" ]] && N=${BASH_REMATCH[1]}
> echo $N 
1023450
Run Code Online (Sandbox Code Playgroud)


Jah*_*hid 5

使用 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)