Analyse/passage d'arguments de ligne de commande à un script bash - quelle est la différence entre “$@” et “$*”?
Je suis à l'aide d'un script bash pour appeler et exécuter un .jar
fichier à partir de n'importe quel endroit sans avoir à constamment entrez son chemin explicite.
La .jar
nécessite l'ajout de la variable de paramètres à spécifier lors de l'exécution, et que ceux-ci peuvent être n'importe quoi, ils ne peuvent pas être codés en dur dans le script.
Il y a 3 variables au total, la première spécifie 1 de 2 actions que l' .jar
est pour faire de, la seconde spécifie un fichier cible à adopter cette action et de la troisième spécifie le nom d'un fichier que l'action consiste à créer.
Le script que j'utilise actuellement est:
#!/bin/bash
java -jar "C:\path\to\file.jar" "$1" "$2" "$3"
Je sais très peu de choses sur scripts bash, mais lors de la recherche pour une autre réponse à mes malheurs (maintenant corrigé) je suis tombé sur "$@"
et "$*"
lors de la citation d'arguments de ligne de commande. Faire plus de recherche m'a amené sur ce site: Comment Wiki: Comment lire les arguments de ligne de commande dans un script bash, mais je ne trouve pas de solides informations sur ces arguments, sans avoir à parcourir des tonnes de advanced bash de programmation qui est bien au-dessus de ma tête.
Alors, maintenant que j'ai divaguait à jamais, ma question est relativement simple:
Puis-je remplacer "$1" "$2" "$3"
avec "$@"
ou "$*"
, et si oui, lequel est le meilleur à utiliser?
Aussi que, le cas échéant, de la différence entre ces commandes?
Mes excuses - j'ai déjà fait la recherche sur google la différence et qui n'a pas de jeter tout StackOverflow pages - j'ai oublié de chercher StackOverflow. - désolé.
double possible de Quelle est la différence entre $@ et $* dans les scripts shell?
OriginalL'auteur Escribblings | 2013-05-20
Vous devez vous connecter pour publier un commentaire.
"$@"
correspond à"$1" "$2" "$3"
etc."$*"
correspond à"$1 $2 $3"
qui vous semblent ne pas avoir besoin.Sans les guillemets, il n'y a pas de différence, ils correspondent tous les deux à
$1 $2 $3
etc."$@"
que j'ai l'impression que c'est le mieux adaptée.OriginalL'auteur choroba
$*
est tous les paramètres en un seul mot,$@
est tous les paramètres individuels de chaîne de caractères entre guillemets.J'ai finit généralement à l'aide de
"$@"
, semble fonctionner le mieux pour moi.OriginalL'auteur mogul
$*
contient une chaîne unique composé de l'ensemble des arguments séparés par le premier caractère de$IFS
. Ainsi, si vous définissezIFS
pour contenir un caractère qui ne peut pas utilement être présents dans vos arguments (par exemple, un retour à la ligne si vous êtes de passage les noms de fichiers), vous pouvez envisager d'$*
et"$@"
être fonctionnellement équivalent, bien qu'ils fonctionnent différemment sous le capot.$@
est essentiellement un tableau de tous les arguments. Lorsqu'il est passé par des guillemets doubles ("$@"
), le shell individuellement encapsule chaque valeur dans le tableau avec des guillemets doubles (une étrange exception à la règle de la double guillemets enveloppant la totalité de l'expansion d'une variable).IIRC, le comportement d'un nu
$@
sans guillemets n'est pas entièrement spécifiée dans POSIX spec, il devrait donc être considéré comme un comportement indéfini. Ainsi, vous ne devez jamais utiliser un nu -$@
sans guillemets.BTW, si vous vous souciez de Système V avant la version 3, il y avait quelques ancienne bizarreries dans la façon dont ils ont géré
$@.
ce sont en grande partie de l'intérêt historique à ce point, mais ils vous donneront une idée de la façon dont la norme a évolué en tant que personnes ont couru dans des problèmes. 🙂OriginalL'auteur dgatwood