Was ist der Wert von $ {# 1}?

9

Bitte erläutern Sie die Verwendung von ${#1}unten:

getlable ()     
{
    if (( ${#1} == 0 )); then test="-"; else test="${1}"; fi;
}
Prasad
quelle
1
Ich frage mich nur: Haben Sie sich die Mühe gemacht, echo ${#1}vor diese Aussage eine zu setzen , um zu sehen, was der Wert ist? Wenn ja, sollten Sie im Allgemeinen das, was Sie in dieser Untersuchung gefunden haben, in die Frage einbeziehen und möglicherweise erklären, warum dies nicht geholfen hat.
jpmc26

Antworten:

24

${#1}ist die Länge (in Anzahl der Zeichen), $1deren erstes Argument für die Funktion ist.

Dies (( ${#1} == 0 ))ist eine komplizierte Methode, um zu testen, ob das erste Argument leer ist (oder nicht festgelegte, nicht festgelegte Parameter erscheinen beim Erweitern als leer) oder nicht.

Um auf einen leeren Parameter zu testen, ist der kanonische Weg:

[ -z "$1" ]

Dort sollte jedoch eher geprüft werden, ob der Funktion ein Argument zur Verfügung gestellt wurde. In diesem Fall lautet die Syntax:

[ "$#" -eq 0 ]

(oder (($# == 0))wenn Sie Ihr Skript ksh / bash / zsh spezifisch machen möchten).

In beiden Fällen haben Bourne-ähnliche Muscheln jedoch Abkürzungen dafür:

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

Wenn die Absicht besteht, dies an ein catanderes Textdienstprogramm zu übergeben, sodass -(dh stdin) übergeben wird, wenn kein Argument angegeben wird, benötigen Sie möglicherweise überhaupt nichts davon.

Anstatt:

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

Mach einfach:

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

Die Liste der Argumente an die Funktion wird unverändert übergeben cat. Wenn es kein Argument gibt, catwird kein Argument empfangen (und dann von stdin gelesen, als ob es ein einzelnes -Argument gewesen wäre). Und wenn es ein oder mehrere Argumente gibt, werden sie alle so übergeben, wie sie sind cat.

Stéphane Chazelas
quelle
So geben Sie eine hervorragende Antwort :)
Yerken
4

${#1} ist die Länge des ersten Positionsparameters.

In einer laufenden Shell können Sie verwenden

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

um sie einzustellen.

Hauke ​​Laging
quelle