Qual é o valor de $ {# 1}?

8

Por favor, explique o uso de ${#1} abaixo:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
    
por Prasad 27.01.2016 / 12:50

2 respostas

24

${#1} é o comprimento (em número de caracteres) de $1 , que é o primeiro argumento para a função.

Portanto, (( ${#1} == 0 )) é uma maneira complicada de testar se o primeiro argumento está vazio (ou não definido, parâmetros não definidos aparecem como vazios quando expandidos) ou não.

Para testar um parâmetro vazio, a maneira canônica é:

[ -z "$1" ]

Mas, provavelmente, a intenção era verificar se um argumento foi fornecido para a função. Nesse caso, a sintaxe seria:

[ "$#" -eq 0 ]

(ou (($# == 0)) se você quiser tornar seu script ksh / bash / zsh específico).

Em ambos os casos, no entanto, as cápsulas Bourne-like têm atalhos para isso:

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

Agora, se a intenção é passar para cat ou outro utilitário de texto para que - (significando stdin) seja passado quando nenhum argumento for fornecido, então você pode não precisar de nada disso.

Em vez de:

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

Basta fazer:

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

A lista de argumentos para a função será passada como é para cat . Se não houver argumento, cat não receberá nenhum argumento (e depois lerá de stdin como se tivesse sido um único argumento - ). E se houver um ou mais argumentos, eles serão passados como estão para cat .

    
por 27.01.2016 / 12:59
4

${#1} é o comprimento do primeiro parâmetro posicional.

Em um shell em execução, você pode usar

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

para configurá-los.

    
por 27.01.2016 / 12:54

Tags