50

iptables は先頭のゼロをうまく処理できないことがわかりました。は他$machinenumberの目的で先頭にゼロを付ける必要があるため、 に$nozero基づいて新しい変数 ( ) を作成するだけ$machinenumberで、先頭のゼロが取り除かれます。

$machinenumberは 01 から 24 までの 2 桁の数字です。現在は 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
4

14 に答える 14

76

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 の場合、結果は null 文字列になります。

于 2012-06-21T01:10:23.267 に答える
24

いいえ、すべて(ほぼすべて)を正しくします。あなたはただしなければなりません:

  • 周りのスペースを削除します=
  • $()代わりにまたはバックティックを使用する()

それは正しいでしょう:

 nozero=$(echo $machinenumber | sed 's/^0*//')

()また、変数を周囲に含めずに使用する必要があります。必要に応じて追加""できます。

iptables -t nat -I POSTROUTING -s "10.$machinetype.$nozero.0/24" -j MASQUERADE

そしてもちろん、ここでの変数は必要ありません。あなたは簡単に言うことができます:

iptables -t nat -I POSTROUTING -s "10.$(echo $machinenumber | sed 's/^0*//').$nozero.0/24" -j MASQUERADE
于 2012-06-20T16:20:44.653 に答える
22

あなたもできる

machinenumber=$(expr $machinenumber + 0)
于 2012-06-20T18:17:00.697 に答える
7
nozero=$(echo $machinenumber | sed 's/^0*//')

周りにスペースを入れずに=、追加の$記号を付けてみてください。

于 2012-06-20T16:20:23.763 に答える
6

純粋な bash ソリューション:

> N=0001023450 
> [[ $N =~ "0*(.*)" ]] && N=${BASH_REMATCH[1]}
> echo $N 
1023450
于 2013-10-23T18:05:03.173 に答える
2

私もまだコメントしたり投票したりすることはできませんが、Duncan Irvineの回答が最高です.

移植性について追記したいと思います。$((10#0009))構文は移植できません。bash と ksh では機能しますが、ダッシュでは機能しません。

$ echo $((10#09))
dash: 1: arithmetic expression: expecting EOF: "10#09"

$ dpkg -s dash | grep -i version
Version: 0.5.7-2ubuntu2

移植性が重要な場合は、sed の回答を使用してください。

于 2015-02-11T12:34:29.233 に答える
1

数値に 0 を追加すると、先頭のゼロが削除されます

eg: expr 00010 + 0 #becomes 10

また

num=00076
num=${num##+(0)}
echo $num
于 2018-10-25T20:23:05.220 に答える
0

先日、関係のないもののためにこのコードを再検討する必要があり、同じスクリプトを読み取る他のソフトウェアとの互換性のために、これに書き直すのが最も簡単であることがわかりました。これはまだ有効な bash である必要があります。

iptables -t nat -I POSTROUTING -s 10.($machinetype).($machinenumber + 0).0/24 -j MASQUERADE

基本的に、0 を追加すると強制的に整数として解釈されるため、先頭のゼロが自動的に削除されます。

于 2013-02-22T13:58:27.033 に答える