Як знайти довжину масиву в оболонці?
Наприклад:
arr=(1 2 3 4 5)
І я хочу отримати його довжину, яка в цьому випадку дорівнює 5.
Як знайти довжину масиву в оболонці?
Наприклад:
arr=(1 2 3 4 5)
І я хочу отримати його довжину, яка в цьому випадку дорівнює 5.
Відповіді:
$ a=(1 2 3 4)
$ echo ${#a[@]}
4
[*]
і [@]
як «вибухають» масиви в токенізірованному рядки, але [@]
може зберегти пробілу в токенах. Однак, підраховуючи елементи, це, здається, не має значення; arr=(foo "bar baz"); echo ${arr[*]}
відбитки 2
, ні 3
.
[@]
на Mac. GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
якщо у когось однакова проблема.
[@]
- це функція для bash 4 і новіших версій . Bash можна оновити через homebrew: itnext.io/upgrading-bash-on-macos-7138bd1066ba
[@]
він повертає довжину першого елемента для мене (за допомогою Bash 4.4.20 (1) -реліз).
З посібника Bash :
$ {# параметр}
Довжина символів розширеного значення параметра підставляється. Якщо параметром є ' ' або '@', заміненим значенням є кількість позиційних параметрів. Якщо параметром є ім'я масиву, підписане на ' ' або '@', замінене значення - це кількість елементів у масиві. Якщо параметр - це індексоване ім'я масиву, підписане від'ємним числом, це число інтерпретується як відносно одного, що перевищує максимальний індекс параметра, тому негативні індекси відлічують від кінця масиву, а індекс -1 посилається на останній елемент.
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
вихід:
string length is: 10
array length is: 10
array length is: 10
hash length is: 3
hash length is: 3
$@
масивом аргументів:set arg1 arg2 "arg 3"
args_copy=("$@")
echo "number of args is: $#"
echo "number of args is: ${#@}"
echo "args_copy length is: ${#args_copy[@]}"
вихід:
number of args is: 3
number of args is: 3
args_copy length is: 3
Припускаючи bash:
~> declare -a foo
~> foo[0]="foo"
~> foo[1]="bar"
~> foo[2]="baz"
~> echo ${#foo[*]}
3
Отже, ${#ARRAY[*]}
розширюється до довжини масиву ARRAY
.
command not found
помилку.
*
? Чим він відрізняється від @
?
у tcsh або csh:
~> set a = ( 1 2 3 4 5 )
~> echo $#a
5
У Fish Shell довжину масиву можна знайти за допомогою:
$ set a 1 2 3 4
$ count $a
4
count
в Unix існує команда. Яку ОС ви використовуєте?
це добре працює для мене
arglen=$#
argparam=$*
if [ $arglen -eq '3' ];
then
echo Valid Number of arguments
echo "Arguments are $*"
else
echo only four arguments are allowed
fi
Для тих, хто все ще шукає спосіб додати довжину масиву до змінної:
foo=$(echo ${'ARRAY[*]}
@
тут робити?