rencontre “opérateur unaire attendu” dans le script bash
dans mon script bash, j'ai une fonction pour renvoyer 0 ou 1(vrai ou faux) pour la fonction principale de l'état.
function1 () {
if [[ "" =~ "^ ...some regexp... $" ]] ; then
return 1
else
return 0
fi
}
puis, dans ma fonction principale:
main () {
for arg in ${@} ; do
if [ function1 ${arg} ] ; then
...
elif [ ... ] ; then
...
fi
done
}
cependant, lorsque j'ai exécuté ce script, il m'a toujours donné un msg d'erreur "[: fonction1: opérateur unaire attendu"
quelqu'un peut m'aider s'il vous plaît?
Notez que, au moins dans bash, version 4, vous ne devez pas citer l'expression régulière: en faisant cela, les forces de simple correspondance de chaîne -- documentée ici. Aussi, vous devez utiliser
Vous devriez mettre votre regex dans une variable.
for arg in "$@"
avec les guillemets, ou plus simple for arg; do ...
Vous devriez mettre votre regex dans une variable.
pattern='^ ...some regexp... $'; if [[ $1 =~ $pattern ]]
. Notez qu'à l'intérieur de doubles crochets, il n'est pas nécessaire de citer les variables et que glenn a dit, la regex (variable) ne doivent jamais être cité.OriginalL'auteur GJ. | 2012-05-14
Vous devez vous connecter pour publier un commentaire.
Vous faites l'erreur de supposer que
[
fait partie de laif
de commande de la syntaxe. Il n'est pas; la syntaxe deif
est tout simplementUne des communes
command
s que nous utilisons est[
qui est un alias de la commandetest
. C'est une simple commande pour la comparaison de chaînes de caractères, nombres, et les fichiers. Il accepte assez étroite combinaison d'arguments, et tend à générer de la confusion et trompeuse des messages d'erreur si vous ne le transmettent pas les arguments attendus. (Ou plutôt, les messages d'erreur sont adéquats et utiles une fois que vous vous habituez à elle, mais ils sont facilement mal compris si vous n'êtes pas habitué.)Dans votre
main
fonction, l'appel à[
semble égaré. Vous avez sans doute direPar la voie, pour faire bonne mesure, vous devez toujours citer vos chaînes. Utilisation
"$1"
pas$1
, et"$arg"
au lieu de$arg
.Les raisons historiques pour
test
comme un général d'évier de cuisine de choses, les auteurs n'ont pas voulu faire partie de la syntaxe deif
est l'un des moins attrayantes conceptions de l'origine du Bourne shell. Bash etzsh
offrir des solutions de rechange qui sont moins encombrants (comme le[[
entre crochets doubles en bash, que vous utilisez dans votrefunction1
définition), et bien sûr, POSIXtest
est beaucoup plus tempérée que la création originale de Bell Labs.Comme une clarification supplémentaire, votre fonction peut être simplifié à juste
Effectuez le test avec
[[
et de renverser son code de résultat. (Le cas "normal" serait de revenir à 0 pour la réussite, mais peut-être que vous essayer de vérifier que la chaîne ne correspond pas?)non, ma fonction 1 en fait vérifie si $1 est correspondant à un certain type d'expression régulière. et ma fonction 1 tout fonctionne très bien tout seul. donc, je pense qu'il y a un problème avec la condition dans ma fonction principale
Oh, désolé, a raté l'erreur dans
main
. Merci pour l'astuce. L'analyse de base tient toujours;[
n'est pas ce que vous pensez qu'elle est.Merci! je ne devrais pas utiliser les crochets à l'intérieur de mes conditions de principal. merci!
J'ai réutilisé cette réponse est stackoverflow.com/a/36371520/874188 qui est davantage l'accent sur la question. Si vous avez établi le lien ici, peut-être cliquer sur la nouvelle question.
OriginalL'auteur tripleee