К сожалению, bash
изма ${!varname}
не доступен нам в csh
, поэтому нам придется пойти старомодный маршрут, используя кавычку и eval
. Правила цитирования csh
отличаются от правил для POSIX-совместимых оболочек, поэтому все это csh
. Здесь мы идем:
set house_number = `eval echo \" \$${name}_house_number\"`
echo "$house_number"
${name}
расширяется в backticked команды, так что это будет равносильно, скажем,
set house_number = `eval echo \" \$Albert_house_number\"`
который затем оценивает
echo " $Albert_house_number"
и из-за кавычку, вывод этого затем назначается house_number
.
Пространство до \$$
необходимо в случае, если значение расширенной переменной имеет особое значение для эха (например, -n
). Мы не могли просто использовать echo "-n"
(он ничего не печатает), но echo " -n"
в порядке.
Дополнительное пространство лишено csh
, когда выражение обратного хода расширено. Это приводит нас к остальным caveat: пробелы в значениях переменных будут удалены; csh
- это обратные шаги. Это означает, что если Albert_house_number
были определены как
set Albert_house_number = "3 4"
house_number
бы в конечном итоге со значением 3 4
(только с одним пространством). Я не знаю, как это предотвратить.
Обратите внимание, что в этом случае echo "$house_number"
линии должны быть внесены изменения, а также, или она будет работать echo "-n"
и не печатать ничего, даже если house_number
имеет правильное значение.
Может быть полезно прочитать следующее: [Можно ли создавать имена переменных из других переменных в bash?] (Http://stackoverflow.com/q/3963494/1983854) – fedorqui
@fedorqui Все они выглядят bash-, или по крайней мере, для POSIX. 'csh' - совершенно другой Зверь (заслуживающий капитала« B »). – Wintermute
Тот же вопрос [также ответил здесь] (http://stackoverflow.com/questions/27604063/variable-of-variable/27606472?s=12|5.2651) – Carpetsmoker