В общем, ответ на ваш вопрос «да», но ...
.equals(...)
будет сравнивать только то, что написано для сравнения, не более, не менее. equals(Object o)
ближайшего родительского класса, который переопределил этот метод. Object#equals(Object o)
. В API-интерфейсе объекта это то же самое, что и ==
; то есть он возвращает true тогда и только тогда, когда обе переменные относятся к одному и тому же объекту, если их ссылки одно и то же. Таким образом, вы будете тестировать на равенство объектов, а не на функциональное равенство. hashCode
, если вы переопределите equals
, чтобы не «разорвать контракт». Согласно API, результат, возвращаемый методом hashCode()
для двух объектов, должен быть таким же, если их методы equals
показывают, что они эквивалентны. Обратное не обязательно верно. Принятый ответ велик. Тем не менее, @Edison спросил, как сделать то же самое для массивов. Фокус в том, что вы хотите, чтобы ваша переменная держала «[@]», так что массив расширяется с помощью «!». Отметьте эту функцию, чтобы сбрасывать переменные:
$ function dump_variables() {
for var in "$@"; do
echo "$var=${!var}"
done
}
$ STRING="Hello World"
$ ARRAY=("ab" "cd")
$ dump_variables STRING ARRAY ARRAY[@]
Выводится:
STRING=Hello World
ARRAY=ab
ARRAY[@]=ab cd
Если указано только как ARRAY
, отображается первый элемент, так как это расширилось !
. Предоставляя формат ARRAY[@]
, вы получаете массив и все его значения расширяются.
${!ARRAY[@]}
, который, похоже, противоречит синтаксису переменной косвенности.
– dimo414
28 August 2014 в 06:33
local -a 'keys=("${!'"$var"'[@]}")'
. Статья косвенных ссылок на Bash Hackers углубляется.
– bishop
28 August 2014 в 14:20
Чтобы сделать более понятным, как это сделать с массивами:
arr=( 'a' 'b' 'c' )
# construct a var assigning the string representation
# of the variable (array) as its value:
var=arr[@]
echo "${!var}"
eval
. – Dennis Williamson 25 May 2012 в 16:58sh
он говорит о плохой замене. Любая идея, как это сделать вsh
? – Shiplu Mokaddim 6 September 2013 в 07:00foo1="something1" foo2="something2" bar[0]="foo1" bar[1]="foo2" echo ${!bar[0]} echo ${!bar[1]}
– dAm2K 15 April 2014 в 00:23sh var=$(eval echo \"\$$bar\")
– Jason Suárez 3 February 2017 в 05:29