J'ai une chaîne qui est le résultat d'une opération sur laquelle je n'ai aucun contrôle. Lorsque j'imprime cette variable à l'aide echo
, j'obtiens:
echo $myvar
hello
Cependant, quand je fais
if [ $myvar = "hello" ]; then
echo they are equal
else
echo they are not equal
fi
J'ai toujours l'impression qu'ils ne sont pas égaux. Je soupçonne que c'est à cause d'un newline
personnage.
La chaîne se comporte également étrangement. Quand je fais:
newVAR="this is my var twice: "$myvar$myvar
echo $newVAR
Je reçois:
hellois my var twice: hello
Comment puis-je vérifier si cela est en fait dû à un newline
et, si oui, le supprimer?
printf '%q\n' "$string"
obtenir une version échappée de n'importe quelle chaîne. Par exemple:printf '%q\n' 'foo\n'
->foo\\n
;printf '%q\n' $'foo\n'
->$'foo\n'
echo $foo
. Faites à laecho "$foo"
place.Réponses:
Le problème est que vous avez un retour chariot intégré (CR,
\r
). Cela provoque le point d'insertion de texte terminal au retour de la ligne qu'il imprime. C'est pourquoi vous voyez le «bonjour» au début de la ligne dans votre$newVAR
exemple -sed -n l
affiche une vue lisible des caractères non imprimables (et à la fin de la ligne).Vous pouvez le tester avec une simple vérification de l'état de bash:
Vous pouvez combiner le test et corriger en une seule étape en testant le
\r
(s) et en les supprimant via:Le correctif utilise Shell Parameter Expansion . La forme particulière utilisée ci-dessus est pour remplacer les sous-chaînes en fonction de votre modèle fourni:
${parameter/pattern/string}
<- Cela remplace uniquement le premier modèle trouvé avec une chaîne dans la variable nommée paramètre *. Pour remplacer tous les modèles, il vous suffit de remplacer le premier/
par//
.la source
fix="....
ligne?fix
peut êtrevar
elle-même - ou souvent vous pouvez simplement utiliser l'expansion des paramètres telleVous pouvez représenter
\r
comme$'\r'
dans bash:Ou coupez le dernier
\r
enmyvar
:la source
Curieusement, dans de nombreux obus
getopts
est un candidat très probable pour un emploi comme celui-ci. Cela peut sembler contre-intuitif au premier abord, mais si vous considérez quegetopts
`` la fonction principale est de reconnaître et d'offrir à l'interprétation autant d'options de ligne de commande à caractère unique spécifiées que dans une série concaténée de la même chose, cela pourrait commencer à faire un peu plus de sens.Pour démontrer, à partir d'un
bash
shell:De cette façon, il peut parfois être pratique de permettre
getopts
de gérer le démontage comme une sorte de pilote automatique de coque pour des cas comme celui-ci. Lorsque vous le faites, vous pouvez simplement éliminer les octets indésirables w / acase
ou[
tester]
et créer votre sauvegarde de chaîne à partir de l'octet 1:Étant donné ce cas d'exemple simple - et étant donné un shell qui prend en charge les extensions de paramètres déjà mentionnées ailleurs - lesdites extensions vous serviront probablement mieux ici. Mais je pensais
getopts
que cela mériterait également d'être mentionné au cas où vous ne seriez pas au courant de ses capacités à cet égard. Certes, quand je l'ai appris, j'ai trouvé de nombreuses applications utiles.la source
Bien que Bash et d'autres langages shell soient pratiques, il est parfois préférable d'utiliser un vrai langage de script - comme Perl. Perl peut remplacer les scripts shell qui appellent d'autres langages tels que sed et awk ainsi que les commandes UNIX assez facilement. J'ai appris cela il y a plus de 20 ans lors de l'écriture de scripts C-Shell qui à leur tour appelaient sed, awk et diverses commandes UNIX - avant d'appeler du code FORTRAN. En Perl je ferais:
la source