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.
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ó.Respuestas:
${#1}
es la longitud (en número de caracteres) de la$1
cual 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:
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:
(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:
Ahora, si la intención es pasar eso
cat
u 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:
Solo haz:
La lista de argumentos de la función se pasará tal cual
cat
. Si no hay argumento,cat
no 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 cualcat
.fuente
${#1}
es la longitud del primer parámetro posicional.En un shell en ejecución puedes usar
para establecerlos
fuente