La suppression de zéros avant de passer une variable d'environnement pour une autre commande
Il s'avère que iptables ne gère pas les zéros trop bien. Comme $machinenumber
qui est utilisé doit avoir un zéro en à d'autres fins, l'idée est simplement de créer une nouvelle variable ($nozero
) basé sur $machinenumber
, où les zéros non significatifs sont supprimées.
$machinenumber
est un nombre à deux chiffres entre 01 et 24. Actuellement, il est 09
$machinetype
est de 74 pour l'instant et n'a pas causé de problèmes avant.
Ce que j'ai jusqu'à présent est:
nozero = (echo $machinenumber | sed 's/^0*//')
iptables -t nat -I POSTROUTING -s 10.($machinetype).($nozero).0/24 -j MASQUERADE
Même si je crois que je suis sur la bonne voie, les résultats de code dans:
ERROR - Unknown string operation
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'utiliser
sed
ou un autre utilitaire externe. Voici un couple de façons de le Bash peut dépouiller les zéros non significatifs pour vous.La
$(())
met en place une opération arithmétique contexte et la10#
convertit le nombre de base 10 en base 10 causant des zéros être abandonné.Quand
extglob
est activée, le paramètre d'expansion montré supprime tous les zéros en tête. Malheureusement, si la valeur initiale est 0, le résultat est une chaîne nulle.10#
est la plus simple et la plus élégante solution que j'ai trouvé jusqu'à présent. Merci!!!!echo $((10#${machinenumber}))
travaille dans kornshell trop! Je cherchais un non-bashism et cela devrait fonctionner. ksh M-11/16/88f$((10#$var))
est une nouvelle découverte pour moi. Je suis surpris que$((10#var))
ne marche pas - j'ai pensé$
était en option à l'intérieur de((...))
pour l'expansion des variables.Pas, assurez-vous (alomost tous) correct.
Vous juste devez:
=
$()
ou backticks au lieu de()
Qui serait correct:
Vous devez également utiliser des variables sans
()
autour d'eux. Vous pouvez ajouter""
si vous le souhaitez:Et bien sûr, les variables ne sont pas nécessaires. Vous pouvez dire tout simplement:
vous pouvez également faire
iptables -t nat -I POSTROUTING -s 10.($machinetype).($machinenumber + 0).0/24 -j MASQUERADE
Je ne peux pas commenter car je n'ai pas suffisamment de réputation, mais je vous suggère d'accepter Dennis réponse (qui est vraiment très joli)
Tout d'abord, je ne pense pas que votre réponse est valable bash.
Dans mon installation j'obtiens:
Si je cite ce que je reçois:
Je suppose que tu veux dire:
Mais, bien sûr, c'est toujours une mauvaise solution, car d'octal:
Je suppose que vos numéros ne sont pas en 08 ou 09 pour le moment.
Voici Dennis:
Certes, ce dernier peut être une entrée de validation de problème pour quelqu'un.
Le sed solution a le problème de l':
Essayer sans les espaces autour de
=
et avec un supplément de$
signe.Un pur bash solution:
[[ "$N" =~ ^0*(.+)$ ]] && N="${BASH_REMATCH[1]}"
- qui fonctionne aussi pour N="000" N="0". Pensez également[[ "$N" =~ ^0*([0-9]+)$ ]]
À l'aide de sed:
Je le fais en utilisant
J'aime mieux cela que la sed approche que ça fonctionne encore avec des nombres tels que 0, 000, 001.
Donc dans votre exemple, je voudrais remplacer
avec
J'ai aussi ne peux pas commenter ou voter encore, mais le Duncan Irvine réponse est le meilleur.
Je voudrais ajouter une remarque à propos de la portabilité. Le
$((10#0009))
syntaxe n'est pas portable. Il fonctionne en bash et ksh, mais pas dans le dash:Si la portabilité est importante pour vous, utilisez le sed réponse.
Je dirais que vous êtes très proche. Je ne vois pas une exigence indiqué pour bash, mais votre logique différente de zéro est erronée.
Ajoutant 0 est une méthode commune pour la modification d'un numéro de chaîne dans une situation de non-rembourré entier. bc est une calculatrice de base. J'utilise cette méthode pour la suppression de l'espace et zéro de remplissage à partir des numéros de tous les temps.
Alors que je ne suis pas expert dans iptables syntaxe, je suis assez sûr que les parenthèses ne sont pas nécessaires. Puisque j'ai déjà non-caractères de mot en bordure de deux variables, je n'ai pas besoin d'un enclos autour d'eux. Les caractères de mot sont;
À l'aide de cette solution, vous ne perdez pas de zéro comme un potentiel de valeur, et devrait être portable sur tous les shells.
Si vous utilisez bash, cela ressemble le plus simple:
J'ai dû revoir ce code, l'autre jour, en raison de certains indépendants des trucs, et pour des raisons de compatibilité avec un autre logiciel qui lit le même script, je l'ai trouvé beaucoup plus facile de le réécrire dans cette, qui doit encore être valide bash:
iptables -t nat -I POSTROUTING -s 10.($machinetype).($machinenumber + 0).0/24 -j MASQUERADE
Fondamentalement, l'ajout de 0, ce qui le force à être interprété comme un entier, donc dénudant les zéros
($machinenumber + 0)
n'est pas des mathématiques syntaxe de bash.Ajouter le numéro 0, il va supprimer les zéros à gauche
OU
Si vous n'avez pas sed ou awk ou perl, alors vous pourriez utiliser couper et grep
Fonctionne à la fois avec bash et le tableau de bord de coquillages.
En bash c'est plus simple:
La valeur de b est maintenant "123".
La forme générale est
${varname//find/replace}
et il remplace un nombre quelconque d'occurrences defind
.