J'écris un script bash dans lequel je dois passer une chaîne contenant des espaces à une fonction de mon script bash.
Par exemple:
#!/bin/bash
myFunction
{
echo $1
echo $2
echo $3
}
myFunction "firstString" "second string with spaces" "thirdString"
Lors de l'exécution, la sortie à laquelle je m'attendais est:
firstString
second string with spaces
thirdString
Cependant, ce qui est réellement produit est:
firstString
second
string
Existe-t-il un moyen de passer une chaîne avec des espaces comme argument unique à une fonction dans bash?
echo "$@"
oufor i in "$@"; do echo $i ; done
pour utiliser des paramètres correctement cités contenant des espaces. C'est le très clairement mentionné dans toute labash
documentation sous lapositional parameters
section.myFunction "$@"
Réponses:
vous devriez mettre des guillemets et aussi, votre déclaration de fonction est fausse.
Et comme les autres, ça marche aussi pour moi. Dites-nous quelle version de shell vous utilisez.
la source
$@
se comporte comme sans guillemets$*
- les résultats sont séparés par une chaîne, puis individuellement développés dans le monde, donc si vous avez des tabulations, ils seront convertis en espaces, si vous avez des mots qui peuvent être évalués comme des expressions globales, ils sera, etc.Une autre solution au problème ci-dessus consiste à définir chaque chaîne sur une variable, appelez la fonction avec des variables désignées par un signe dollar littéral
\$
. Ensuite, dans la fonction, utilisezeval
pour lire la variable et la sortie comme prévu.La sortie est alors:
En essayant de résoudre un problème similaire à celui-ci, je tombais sur le problème d'UNIX en pensant que mes variables étaient délimitées par des espaces. J'essayais de passer une chaîne délimitée par un tube à une fonction en utilisant
awk
pour définir une série de variables utilisées plus tard pour créer un rapport. J'ai d'abord essayé la solution publiée par ghostdog74 mais je n'ai pas pu la faire fonctionner car tous mes paramètres n'étaient pas passés entre guillemets. Après avoir ajouté des guillemets à chaque paramètre, il a alors commencé à fonctionner comme prévu.Vous trouverez ci-dessous l'état avant de mon code et fonctionne pleinement après l'état.
Avant - Code non fonctionnel
Après - Code de fonctionnement
la source
La solution la plus simple à ce problème est qu'il vous suffit d'utiliser
\"
des arguments séparés par des espaces lors de l'exécution d'un script shell:la source
Votre définition de myFunction est erronée. Ça devrait être:
ou:
Quoi qu'il en soit, cela a l'air bien et fonctionne bien pour moi sur Bash 3.2.48.
la source
J'ai 9 ans de retard mais une manière plus dynamique serait
la source
Solution simple qui a fonctionné pour moi - cité $ @
J'ai pu vérifier la commande grep réelle (grâce à set -x).
la source
Vous pourriez avoir une extension de ce problème dans le cas où votre texte initial a été défini dans une variable de type chaîne, par exemple:
Dans ce cas, si vous ne transmettez pas la variable status_message sous forme de chaîne (entourée de ""), elle sera divisée en un montage d'arguments différents.
"$ variable" : La piste actuelle est CDE at DEF by ABC
$ variable : La
la source
myFunction "firstString" "second string with spaces" "thirdString"
et cela n'a pas fonctionné pour lui. Donc, ce que vous proposez ne s'applique pas à cette question.J'ai eu le même genre de problème et en fait le problème n'était pas la fonction ni l'appel de fonction, mais ce que j'ai passé en arguments à la fonction.
La fonction a été appelée à partir du corps du script - le 'main' - donc j'ai passé "st1 a b" "st2 c d" "st3 e f" à partir de la ligne de commande et je l'ai passée à la fonction en utilisant myFunction $ *
Le $ * cause le problème car il se développe en un jeu de caractères qui sera interprété dans l'appel à la fonction en utilisant des espaces comme délimiteur.
La solution était de changer l'appel à la fonction dans la gestion explicite des arguments du 'main' vers la fonction: l'appel serait alors myFunction "$ 1" "$ 2" "$ 3" qui conservera les espaces à l'intérieur des chaînes car les guillemets délimiteront les arguments ... Donc si un paramètre peut contenir des espaces, il doit être traité explicitement à travers tous les appels de fonctions.
Comme cela peut être la raison de longues recherches sur des problèmes, il peut être judicieux de ne jamais utiliser $ * pour passer des arguments ...
J'espère que cela aidera quelqu'un, un jour, quelque part ... Jan.
la source
"$@"
, pas tous cités"$1"
,"$2"
... paramters de position ni$*
.