Я выбросил этот ответ как жаворонок.Имейте в виду, что eval
- это дыра в безопасности, через которую вы можете вести бомбу грузовика, если данные не подвергаются тщательному мониторингу и / или очистке.Eval был чрезмерно легкомысленным использованием сарказма, который я должен был сделать более ясным.(Я думал, что строка о Java или Perl прояснит это, но я не думаю, lol)
Вот более разумная версия, которую вы заметите, использовав решение Чарльза Даффи почти точно.
lengthOf() {
local -n standin=$1 # standin is a *reference* to the name passed
echo "${#standin[@]}"
}
Это работает так же, как мой оригинал ниже, но рассмотрим типичное использование - в большинстве случаев вы просто хотите сохранить возврат, поэтому идиома будет
len=$( lengthOf someArray )
Если это так, Пожалуйста, см. Решение Чарльза, поскольку для этого гораздо лучше назначить переменную непосредственно в том же вызове.
Оригинальный ответ
Если вам просто нужен синтаксический сахар, вам придется вникать в сорняки тех частей, которые вам не нравятся, иможет быть, это вызовет некоторые довольно уродливые проблемы с безопасностью ... но вот вариант, для удовольствия от упражнения.Кто-то наверняка предложит уточнения.
lengthOf() { eval "echo \${#$1[@]}"; }
Теперь, если у вас есть массив, объявленный как a=( a b c )
, вы можете сделать это:
lengthOf a
, и он напечатает 3
.Только не ожидайте, что он даст вам длину строки вместо массива ....
Bash - это все о контексте, поэтому, если вас беспокоит небольшое синтаксическое усилие, может быть, вы должны попробовать другой язык ... как Java, или Perl, лол!;)