присвоение имени текстовому файлу в сценарии оболочки [duplicate]

В общем, ответ на ваш вопрос «да», но ...

  • .equals(...) будет сравнивать только то, что написано для сравнения, не более, не менее.
  • Если класс не переопределяет метод equals, то по умолчанию используется метод equals(Object o) ближайшего родительского класса, который переопределил этот метод.
  • Если родительские классы не предоставили переопределение, то по умолчанию используется метод из конечного родительского класса Object и поэтому вы остаетесь с методом Object#equals(Object o). В API-интерфейсе объекта это то же самое, что и ==; то есть он возвращает true тогда и только тогда, когда обе переменные относятся к одному и тому же объекту, если их ссылки одно и то же. Таким образом, вы будете тестировать на равенство объектов, а не на функциональное равенство.
  • Всегда помните, чтобы переопределить hashCode, если вы переопределите equals, чтобы не «разорвать контракт». Согласно API, результат, возвращаемый методом hashCode() для двух объектов, должен быть таким же, если их методы equals показывают, что они эквивалентны. Обратное не обязательно верно.
29
задан user1165454 25 May 2012 в 22:17
поделиться

4 ответа

eval echo \"\$$bar\" сделает это.

57
ответ дан Gilles 20 August 2018 в 07:56
поделиться
  • 1
  • 2
    Гораздо лучше, чем мой ответ. – mkb 25 May 2012 в 17:15
  • 3
    @mkb Я не знал eval :-) – dAm2K 25 May 2012 в 23:28
  • 4
    в sh он говорит о плохой замене. Любая идея, как это сделать в sh? – Shiplu Mokaddim 6 September 2013 в 07:00
  • 5
    как это работает с массивами? – Edison 14 April 2014 в 22:14
  • 6
    @Edison foo1="something1" foo2="something2" bar[0]="foo1" bar[1]="foo2" echo ${!bar[0]} echo ${!bar[1]} – dAm2K 15 April 2014 в 00:23
  • 7
    Это решение имеет преимущества совместимости с POSIX для не-Bash-оболочек (например, в таких легких средах, как встроенные системы или контейнеры Docker). И вы можете присвоить значение другой переменной следующим образом: sh var=$(eval echo \"\$$bar\") – Jason Suárez 3 February 2017 в 05:29
57
ответ дан Gilles 31 October 2018 в 06:51
поделиться

Принятый ответ велик. Тем не менее, @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[@], вы получаете массив и все его значения расширяются.

6
ответ дан bishop 20 August 2018 в 07:56
поделиться
  • 1
    Хороший вопрос об обработке массивов. Любая идея, как получить индексы массива? В руководстве указано, что это обычно делается с помощью ${!ARRAY[@]}, который, похоже, противоречит синтаксису переменной косвенности. – dimo414 28 August 2014 в 06:33
  • 2
    @ dimo414 Да, получить ключи через косвенность сложнее. Вам нужно будет передать только имя, а затем выполнить расширение в методе: 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}"
0
ответ дан Jahid 20 August 2018 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: