Qual è il valore di $ {# 1}?


9

Si prega di spiegare l'uso di ${#1}seguito:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}

1
Mi chiedo solo: ti sei preso la briga di mettere echo ${#1}un'affermazione prima di vedere qual è il valore? In tal caso, dovresti generalmente includere nella domanda ciò che hai trovato in quella ricerca e forse una spiegazione del perché non ha aiutato.
jpmc26,

Risposte:


24

${#1}è la lunghezza (in numero di caratteri) di $1cui è il primo argomento della funzione.

Quindi (( ${#1} == 0 ))è un modo contorto per verificare se il primo argomento è vuoto (o non impostato, i parametri non impostati appaiono vuoti quando vengono espansi) oppure no.

Per verificare un parametro vuoto, il modo canonico è:

[ -z "$1" ]

Ma lì, più probabilmente l'intento era di verificare se fosse stato fornito un argomento alla funzione, nel qual caso la sintassi sarebbe:

[ "$#" -eq 0 ]

(o (($# == 0))se vuoi rendere specifico il tuo script ksh / bash / zsh).

In entrambi i casi, tuttavia, le conchiglie simili a Bourne hanno scorciatoie per questo:

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

Ora, se l'intenzione è quella di passare quella cato altra utilità di testo in modo che -(significato stdin) venga passato quando non viene fornito alcun argomento, allora potrebbe non essere necessario nulla di tutto ciò.

Invece di:

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

Basta fare:

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

L'elenco degli argomenti della funzione verrà passato così com'è cat. Se non c'è nessun argomento, catnon riceverà alcun argomento (e quindi letto da stdin come se fosse stato un singolo -argomento). E se ci sono uno o più argomenti, tutti verranno passati così come sono cat.


ora è così che fornisci una risposta eccellente :)
Yerken,

4

${#1} è la lunghezza del primo parametro posizionale.

In una shell in esecuzione puoi usare

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

per impostarli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.