Comment obtenir le premier caractère de la variable
Je vais essayer d'obtenir le premier caractère d'une variable, mais je suis de se faire une Mauvaise erreur de substitution. Quelqu'un peut-il m'aider à résoudre ce problème?
code est:
while IFS=$'\n' read line
do
if [ ! ${line:0:1} == "#"] # Error on this line
then
eval echo "$line"
eval createSymlink $line
fi
done < /some/file.txt
Je fais quelque chose de mal ou est-il une meilleure manière de faire ceci?
-- EDIT --
Comme demandé, voici quelques exemples d'entrée, qui est stocké dans /some/file.txt
$MOZ_HOME/mobile/android/chrome/content/browser.js
$MOZ_HOME/mobile/android/locales/en-US/chrome/browser.properties
$MOZ_HOME/mobile/android/components/ContentPermissionPrompt.js
peut-être vous avez besoin d'un espace entre le guillemet de fermeture et la fermeture de parenthèses, c'est à dire
aussi, vous pourriez aussi bien aller avec
aucun de ceux qui ont travaillé - désolé! Toujours faire une Mauvaise erreur de substitution à la ligne
pouvez-vous poster quelques données d'entrée à partir de file.txt on peut donc les tester?
Peut-être il y a une ligne vide dans le fichier, ou une ligne de départ avec des espaces blancs? essayez avec
"#" ]
aussi, vous pourriez aussi bien aller avec
A != B
au lieu de ! A == B
aucun de ceux qui ont travaillé - désolé! Toujours faire une Mauvaise erreur de substitution à la ligne
pouvez-vous poster quelques données d'entrée à partir de file.txt on peut donc les tester?
Peut-être il y a une ligne vide dans le fichier, ou une ligne de départ avec des espaces blancs? essayez avec
if [ ! "${line:0:1}" == "#" ]
OriginalL'auteur Martyn | 2013-07-18
Vous devez vous connecter pour publier un commentaire.
Pour obtenir le premier caractère d'une variable, vous devez dire:
Cependant, votre code contient une erreur de syntaxe:
Donc cela peut faire l'affaire:
Il peut aussi être fait comme ceci:
Mise à jour
Basé sur votre mise à jour, cela fonctionne pour moi:
apparemment cela ne fonctionne pas, haha. Voir OP commentaire.
Vous avez mon +1 pour l'esprit sportif!
Je vais vous donner un +1 pour l'esprit sportif! Pour info, j'ai essayé ceci : ="123456" | [ ! "${un:0:1}" == "#" ] && echo "ne pas commencer par #" et a obtenu un baccalauréat erreur de trop. Pourrait-il être quelque chose à faire avec bash version?
Oh, je vois, sur le site uhms. Qu'en est
[ "${a:0:1}" != "#" ]
?, peut-être que le" [ ! a == b ] " n'est pas agréable pour votre bash version.OriginalL'auteur fedorqui
L'ajout de l'espace manquant (comme suggéré dans fedorqui réponse 😉 ) fonctionne pour moi.
Une méthode alternative/syntaxe
Voici ce que je voudrais faire en Bash si je veux vérifier le premier caractère d'une chaîne
Sur le côté droit de
==
, la cité de la partie est traitée littéralement alors que*
est un caractère générique pour n'importe quelle séquence de caractères.Pour plus d'informations, voir la dernière partie de Conditionnel Constructions de Bash manuel de référence:
Vérifier que vous utilisez bien le droit de shell
Si vous obtenez des erreurs telles que "Mauvaise erreur de substitution" et "[[: pas trouvé" (voir commentaire) même si votre syntaxe est très bien (et fonctionne très bien pour les autres), il peut indiquer que vous utilisez le mauvais shell (c'est à dire pas de Bash).
Donc, assurez-vous que vous utilisez Bash pour exécuter le script, soit
#!/bin/bash
bash my_script
Également noter que sh n'est pas nécessairement bash, parfois, il peut être dash (par exemple Ubuntu), ou tout simplement d'ol' Bourne shell.
Peut-être que... vous n'êtes même pas à l'aide de Bash?
% echo $SHELL /bin/bash
qu'obtenez-vous avec
type [[
?Ouais. Je suis juste content que ce ne finissent pas comme un de ces non-reproductible mystère cas.
OriginalL'auteur doubleDown
Essayez ceci:
ou vous pouvez utiliser les éléments suivants pour votre
if
syntaxe:est valide "pas" paramètre de test ([), alors j'aimerais garder à l'intérieur de moi-même
merci!
OriginalL'auteur jaypal singh
TIMTOWTDI ^^
Note: j'ai abandonné l'eval, ce qui pourrait être nécessaire dans certains (rares!) cas (et dangereux).
Note2: j'ai ajouté un "plus sûr" FI & lire (-r, raw), mais vous pouvez revenir à votre propre si elle est mieux adaptée. Notez qu'il continue de lit ligne par ligne.
Nota3: j'ai pris l'habitude d'utiliser toujours ${var} au lieu de $var ... fonctionne pour moi (facile à trouver vars dans un texte complexe, et il est facile de voir où ils commencent et se terminent à tous les temps), mais pas nécessaire ici.
Note4: vous pouvez également modifier le test :
*"#"*)
si certains (les commentaires?) les lignes peuvent avoir des espaces ou des tabulations avant le '#' (et aucun lien symbolique lignes qui ne contiennent pas un '#')OriginalL'auteur Olivier Dulac