2015-05-04 4 views
0

Я пытаюсь создать переменную в скрипте на основе другой переменной.создавать переменные внутри скрипта unix

Я просто не знаю, что нужно изменить в моем коде, если это возможно. Я упрощаю код для вашего понимания, так что это не оригинальный код.

код выглядит, что:

#!/bin/csh -f 

set list_names=(Albert Bela Corine David) 
set Albert_house_number=1 
set Bela_house_number=2 
set Corine_house_number=3 
set David_house_number=4 

foreach name ($list_names) 
    #following line does not work.... 
    set house_number=$($name\_house_number) 
    echo $house_number 
end 

желаемый результат должен быть:

1 
2 
3 
4 

Спасибо за вашу помощь.

+0

Может быть полезно прочитать следующее: [Можно ли создавать имена переменных из других переменных в bash?] (Http://stackoverflow.com/q/3963494/1983854) – fedorqui

+2

@fedorqui Все они выглядят bash-, или по крайней мере, для POSIX. 'csh' - совершенно другой Зверь (заслуживающий капитала« B »). – Wintermute

+0

Тот же вопрос [также ответил здесь] (http://stackoverflow.com/questions/27604063/variable-of-variable/27606472?s=12|5.2651) – Carpetsmoker

ответ

1

К сожалению, 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 имеет правильное значение.

+0

Спасибо Wintermute, это отличное объяснение, и я многому научился! – Tamir

Смежные вопросы