Qual é o valor de $ {# 1}?

9

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

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
Prasad
fonte
1
Apenas imaginando: você se incomodou em colocar uma echo ${#1}declaração antes dessa para ver qual é o valor? Nesse caso, você deve geralmente incluir o que encontrou nessa pesquisa na pergunta e talvez uma explicação de por que isso não ajudou.
Jpmc26 28/01

Respostas:

24

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

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

Para testar um parâmetro vazio, o caminho canônico é:

[ -z "$1" ]

Porém, é mais provável que a intenção seja 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 específico para ksh / bash / zsh).

Em ambos os casos, no entanto, as conchas tipo Bourne 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 isso para catou outro utilitário de texto para que -(significando stdin) seja transmitido quando nenhum argumento for fornecido, talvez você não precise disso.

Ao invés de:

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

Apenas faça:

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

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

Stéphane Chazelas
fonte
agora é assim que proporcionam uma excelente resposta :)
Yerken
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.

Hauke ​​Laging
fonte