2014-10-22 3 views
6

У меня есть переменная bash: agent1.ip с 192.168.100.137 в качестве значения. Когда я ссылаться на него в echo:Ссылка на переменную bash, имя которой содержит точку

echo $agent1.ip 

результат:

.ip 

Как получить значение?

UPDATE: мои переменных:

enter image description here

+6

Как вы получили имя '.' В имени переменной в первую очередь? –

+2

Действительно, поскольку @TomFenech намекает на то, что это не допустимое имя переменной. Невозможно * иметь * переменную с этим именем вообще. –

+0

Я использую инструмент, который запускает мой bash, и имеет переменную env с пунктирным именем ... –

ответ

9

сам Bash не понимает имена переменных с точками в них, но это не значит, что вы не можете иметь такую ​​переменную в вашем Окружающая среда. Вот пример того, как установить его и получить все это в одном:

env 'agent1.ip=192.168.100.137' bash -c 'env | grep ^agent1\\.ip= | cut -d= -f2-' 
+0

Затем вы можете присвоить это значение правильному имени переменной bash. – Dettorer

+0

Правило grep неверно, пожалуйста, укажите \, или оно также примет agent1_ip или agent1-ip и т. Д. – drizzt

+0

@drizzt: вы правы, я добавил еще один '' ', чтобы правильно избежать шаблона. –

0

вложен ваш код, и с помощью функций или сценариев, которые используют Ksh?

Пунктирные имена переменных являются расширенной функцией в ksh93. Простой случай

$ a=1 
$ a.b=123 
$ echo ${a.b} 
123 
$ echo $a 
1 

Если первая попытка присвоить a.b, вы получите

-ksh: a.b=123: no parent 

IHTH

2

Попробуйте это:

export myval=`env | grep agent1.port | awk -F'=' '{print $2}'`;echo $myval 
+0

Обратите внимание, что '.' В 'grep' означает« любой символ », поэтому это будет вести себя плохо, если есть, например, 'Agent1Sport'. Аналогично 'flagent1.port' или' blagent1Sportier'.См. Мой ответ для более точного выражения. –

+0

Да, вы правы. Я должен был сбежать ». – SMA

2

bash.ip Поскольку не действительный идентификатор в bash, строка окружения bash.ip=192.168.100.37 не используется для создания переменной оболочки при запуске оболочки.

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

bash_ip=$(awk 'BEGIN {print ENVIRON["bash.ip"]}') 
Смежные вопросы