¿Cuál es el valor de $ {# 1}?

9

Por favor explique el uso de ${#1}abajo:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
Prasad
fuente
1
Solo me pregunto: ¿te molestaste en poner un echo ${#1}antes de esa declaración para ver cuál es el valor? Si es así, generalmente debe incluir lo que encontró en esa investigación en la pregunta, y tal vez una explicación de por qué no ayudó.
jpmc26

Respuestas:

24

${#1}es la longitud (en número de caracteres) de la $1cual es el primer argumento de la función.

Entonces, (( ${#1} == 0 ))es una forma complicada de probar si el primer argumento está vacío (o no, los parámetros no establecidos aparecen como vacíos cuando se expanden) o no.

Para probar un parámetro vacío, la forma canónica es:

[ -z "$1" ]

Pero allí, lo más probable es que la intención fuera verificar si se proporcionó un argumento a la función, en cuyo caso la sintaxis sería:

[ "$#" -eq 0 ]

(o (($# == 0))si desea que su script sea específico para ksh / bash / zsh).

Sin embargo, en ambos casos, los proyectiles tipo Bourne tienen atajos para eso:

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

Ahora, si la intención es pasar eso catu otra utilidad de texto para que -se pase (es decir, stdin) cuando no se proporciona ningún argumento, entonces es posible que no necesite nada de eso.

En vez de:

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

Solo haz:

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

La lista de argumentos de la función se pasará tal cual cat. Si no hay argumento, catno recibirá ningún argumento (y luego leerá desde stdin como si hubiera sido un -argumento único ). Y si hay uno o más argumentos, todos se pasarán tal cual cat.

Stéphane Chazelas
fuente
ahora así es como proporciona una excelente respuesta :)
Yerken
4

${#1} es la longitud del primer parámetro posicional.

En un shell en ejecución puedes usar

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

para establecerlos

Hauke ​​Laging
fuente