@AhmedAkhtar Es gibt eine anständige Erklärung hier . Grundsätzlich [*]und [@]beide "explodieren" Arrays in eine Token-Zeichenfolge, [@]können jedoch Leerzeichen innerhalb von Token beibehalten . Beim Zählen von Elementen scheint dies jedoch keine Rolle zu spielen. arr=(foo "bar baz"); echo ${arr[*]}druckt 2nicht 3.
Kyle Strand
Dies funktionierte bei mir aber erst nach dem Entfernen [@]auf dem Mac. GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)wenn jemand das gleiche Problem hat.
Die Länge des erweiterten Werts des Parameters in Zeichen wird ersetzt. Wenn der Parameter ' ' oder '@' ist, ist der ersetzte Wert die Anzahl der Positionsparameter. Wenn der Parameter ein Array-Name ist, der durch ' ' oder '@' gekennzeichnet ist, ist der ersetzte Wert die Anzahl der Elemente im Array. Wenn parameter ein indizierter Array-Name ist, der durch eine negative Zahl gekennzeichnet ist, wird diese Zahl als relativ zu einem Wert interpretiert, der größer als der maximale Index des Parameters ist, sodass negative Indizes vom Ende des Arrays zurückzählen und ein Index von -1 auf den letzten verweist Element.
Länge von Strings, Arrays und assoziativen Arrays
string="0123456789"# create a string of 10 characters
array=(0 1 2 3 4 5 6 7 8 9) # create an indexed array of 10 elementsdeclare -A hashhash=([one]=1 [two]=2 [three]=3) # create an associative array of 3 elementsecho"string length is: ${#string}"# length of stringecho"array length is: ${#array[@]}"# length of array using @ as the indexecho"array length is: ${#array[*]}"# length of array using * as the indexecho"hash length is: ${#hash[@]}"# length of array using @ as the indexecho"hash length is: ${#hash[*]}"# length of array using * as the index
Ausgabe:
string length is: 10
array length is: 10
array length is: 10
hash length is: 3
hash length is: 3
Umgang mit $@dem Argument Array:
set arg1 arg2 "arg 3"
args_copy=("$@")
echo"number of args is: $#"echo"number of args is: ${#@}"echo"args_copy length is: ${#args_copy[@]}"
Ausgabe:
number of args is: 3
number of args is: 3
args_copy length is: 3
Diese Frage ist ziemlich alt, aber ich möchte wissen, wie diese Länge des Arrays in einer Variablen gespeichert werden kann. Ich habe so etwas wie foo = $ {# foo [*]} versucht, aber die Shell wirft einen command not foundFehler.
Shekhar
1
Was ist *? Wie unterscheidet es sich von @?
Jameshfisher
@jameshfisher Bei dieser Verwendung ist dies nicht der Fall.
@
hier?[*]
und[@]
beide "explodieren" Arrays in eine Token-Zeichenfolge,[@]
können jedoch Leerzeichen innerhalb von Token beibehalten . Beim Zählen von Elementen scheint dies jedoch keine Rolle zu spielen.arr=(foo "bar baz"); echo ${arr[*]}
druckt2
nicht3
.[@]
auf dem Mac.GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
wenn jemand das gleiche Problem hat.[@]
ist eine Funktion für Bash 4 und höher . Bash kann über Homebrew aktualisiert werden: itnext.io/upgrading-bash-on-macos-7138bd1066ba[@]
es die Länge des ersten Elements für mich zurück (mit Bash 4.4.20 (1) -release).Aus dem Bash- Handbuch :
Länge von Strings, Arrays und assoziativen Arrays
string="0123456789" # create a string of 10 characters array=(0 1 2 3 4 5 6 7 8 9) # create an indexed array of 10 elements declare -A hash hash=([one]=1 [two]=2 [three]=3) # create an associative array of 3 elements echo "string length is: ${#string}" # length of string echo "array length is: ${#array[@]}" # length of array using @ as the index echo "array length is: ${#array[*]}" # length of array using * as the index echo "hash length is: ${#hash[@]}" # length of array using @ as the index echo "hash length is: ${#hash[*]}" # length of array using * as the index
Ausgabe:
string length is: 10 array length is: 10 array length is: 10 hash length is: 3 hash length is: 3
Umgang mit
$@
dem Argument Array:set arg1 arg2 "arg 3" args_copy=("$@") echo "number of args is: $#" echo "number of args is: ${#@}" echo "args_copy length is: ${#args_copy[@]}"
Ausgabe:
quelle
Angenommen, Bash:
~> declare -a foo ~> foo[0]="foo" ~> foo[1]="bar" ~> foo[2]="baz" ~> echo ${#foo[*]} 3
Erweitert
${#ARRAY[*]}
sich also auf die Länge des ArraysARRAY
.quelle
command not found
Fehler.*
? Wie unterscheidet es sich von@
?in tcsh oder csh:
~> set a = ( 1 2 3 4 5 ) ~> echo $#a 5
quelle
In der Fischschale kann die Länge eines Arrays gefunden werden mit:
$ set a 1 2 3 4 $ count $a 4
quelle
count
in Unix einen Befehl gibt . Welches Betriebssystem verwenden Sie?das funktioniert gut für mich
arglen=$# argparam=$* if [ $arglen -eq '3' ]; then echo Valid Number of arguments echo "Arguments are $*" else echo only four arguments are allowed fi
quelle
Für diejenigen, die noch nach einer Möglichkeit suchen, die Länge eines Arrays in eine Variable zu setzen:
foo=$(echo ${'ARRAY[*]}
quelle