Quelle est la valeur de $ {# 1}?

9

Veuillez expliquer l'utilisation de ${#1}ci-dessous:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
Prasad
la source
1
Je me demandais simplement: avez-vous pris la peine de mettre un echo ${#1}avant cette déclaration pour voir quelle est la valeur? Si oui, vous devriez généralement inclure ce que vous avez trouvé dans cette recherche dans la question, et peut-être une explication de la raison pour laquelle cela n'a pas aidé.
jpmc26

Réponses:

24

${#1}est la longueur (en nombre de caractères) $1qui est le premier argument de la fonction.

Il en (( ${#1} == 0 ))va de même pour tester de façon alourdie si le premier argument est vide (ou non défini, les paramètres non définis apparaissent comme vides lorsqu'ils sont développés) ou non.

Pour tester un paramètre vide, la méthode canonique est:

[ -z "$1" ]

Mais là, plus probablement, l'intention était de vérifier si un argument était fourni à la fonction, auquel cas la syntaxe serait:

[ "$#" -eq 0 ]

(ou (($# == 0))si vous voulez rendre votre script spécifique à ksh / bash / zsh).

Dans les deux cas cependant, les obus de type Bourne ont des raccourcis pour cela:

test=${1:--} # set test to $1, or "-" if $1 is empty or not provided
test=${1--}  # set test to $1, or "-" if $1 is not provided

Maintenant, si l'intention est de transmettre cela à catou à un autre utilitaire de texte afin que -(signifiant stdin) soit passé quand aucun argument n'est fourni, alors vous n'aurez peut-être pas besoin de tout cela.

Au lieu de:

getlable() {
  test=${1--}
  cat -- "$test"
}

Faites juste:

getlable() {
  cat -- "$@"
}

La liste des arguments de la fonction sera transmise telle quelle cat. S'il n'y a pas d'argument, il catne recevra aucun argument (puis lira à partir de stdin comme s'il s'agissait d'un seul -argument). Et s'il y a un ou plusieurs arguments, ils seront tous transmis tels quels cat.

Stéphane Chazelas
la source
voilà comment vous fournissez une excellente réponse :)
Yerken
4

${#1} est la longueur du premier paramètre positionnel.

Dans un shell en cours d'exécution, vous pouvez utiliser

set -- foo bar
echo ${#1}
3

pour les définir.

Hauke ​​Laging
la source