J’ai du mal à comprendre ce que $ {@} signifie dans KSH

Pas une longue question, qu’est-ce que cela signifie?

LogMsg "File:${@}" 

LogMsg () est une méthode qui enregistre un message avec un horodatage.

Mais que diable fait

 ${@} 

signifier? Je devrais également mentionner que le script a aussi 1 $ et 2 $. Google ne produit aucun résultat.

Littéralement:

 f() { printf '%s\n' "File: $@"; } f "First Argument" "Second Argument" "Third Argument" 

va développer et exécuter la commande:

 printf '%s\n' "File: First Argument" "Second Argument" "Third Argument" 

C’est-à-dire: Il étend votre liste d’arguments ( $1 , $2 , $3 , etc.) tout en maintenant la séparation entre les arguments suivants (ne pas jeter les informations fournies par l’utilisateur en guise de citations).


Ceci est différent de:

 printf '%s\n' File: $@ 

ou

 printf '%s\n' File: $* 

qui sont les mêmes que:

 printf '%s\n' "File:" "First" "Argument" "Second" "Argument" "Third" "Argument" 

… la liste des arguments est divisée en deux parties et glob-expand, donc si l’utilisateur avait passé, disons "*" (entre guillemets destinés à le rendre littéral), l’utilisation non indiquée ici remplacerait ce caractère par les résultats de l’élargir comme un glob, c.-à-d. la liste des fichiers du répertoire en cours. En outre, le fractionnement de chaînes a d’autres effets secondaires, tels que le changement de lignes ou d’tabs en espaces.


C’est aussi différent de:

 printf '%s\n' "File: $*" 

qui est la même que:

 printf '%s\n' "File: First Argument Second Argument Third Argument" 

… qui, comme vous pouvez le voir ci-dessus, combine tous les arguments en mettant le premier caractère dans IFS (qui est par défaut un espace) entre eux.

dans KSH il y a deux parameters de position * et @

"$*" est une chaîne unique constituée de tous les parameters de position, séparés par le premier caractère de la variable IFS (séparateur de champ interne), qui est un espace, une tabulation et une nouvelle ligne par défaut.

D’autre part, "$@" est égal à "$1" "$2" … "$N " , où N est le nombre de parameters de position.

Pour plus d’informations détaillées et exemple: http://oreilly.com/catalog/korn2/chapter/ch04.html

C’est l’ensemble des arguments de la ligne de commande. Si vous lancez un script via une commande comme cmd abcd , il y a 5 arguments, $0 sera la commande cmd , $1 le premier argument a , $2 le deuxième b , etc. ${@} sera tous les arguments sauf la commande.

Le seul élément qui n’a pas été expliqué par les autres articles est l’utilisation de { . $@ est identique à ${@} mais vous permet d’append des lettres, etc. si nécessaire et ces lettres n’auront pas d’espace ajouté. Par exemple, vous pourriez dire ${foo}dog et si $ foo a été mis à little le résultat serait littledog sans espaces. Dans le cas de ${@}dogdog et $@ est défini sur abcd le résultat est “a” “b” “c” “ddogdog”.