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.
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.Antworten:
${#1}
ist die Länge (in Anzahl der Zeichen),$1
deren 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:
Dort sollte jedoch eher geprüft werden, ob der Funktion ein Argument zur Verfügung gestellt wurde. In diesem Fall lautet die Syntax:
(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:
Wenn die Absicht besteht, dies an ein
cat
anderes Textdienstprogramm zu übergeben, sodass-
(dh stdin) übergeben wird, wenn kein Argument angegeben wird, benötigen Sie möglicherweise überhaupt nichts davon.Anstatt:
Mach einfach:
Die Liste der Argumente an die Funktion wird unverändert übergeben
cat
. Wenn es kein Argument gibt,cat
wird 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 sindcat
.quelle
${#1}
ist die Länge des ersten Positionsparameters.In einer laufenden Shell können Sie verwenden
um sie einzustellen.
quelle