Как напечатать имя переменной вместе с ее значением?


10

Есть ли способ, как я могу напечатать имя переменной вместе с ее значением?

j=jjj
k=kkk
l=lll

for i in j k l
do
    ....
done

Ожидаемый результат (каждая переменная в отдельной строке):

j = jjj 
k = kkk
l = lll

Кто-нибудь может предложить способ получить вышеуказанный результат?


Ответы:


21

Простым способом:

j="jjj"
k="kkk"
l="lll"

for i in {j,k,l}; do echo "$i = ${!i}"; done

Выход:

j = jjj
k = kkk
l = lll

  • ${!i}- расширение / косвенность bash- переменной (получает значение имени переменной, хранящейся в $i)

2
Вы можете сделать {j,k,l}короткий , с {j..l}также:)
αғsнιη

@ αғsнιη, это разумно для расширенных диапазонов, если есть только 3 предмета - {j,k,l}будет достаточно
RomanPerekhrest

1
j k lбыло бы достаточно.
Стефан

6

Если у вас bash v4.4 или новее, вы можете использовать ${VAR@A}оператор расширения параметров.

Это обсуждается в руководстве по Bash в разделе 3.5.3 Расширение параметров оболочки

Оператор «А»

Раскрытие представляет собой строку в форме оператора присваивания или объявления, которая при оценке воссоздает параметр с его атрибутами и значением.

Итак, с этим вы можете сделать:

j="jjj"
k="kkk"
l="lll"

for i in {$j,$k,$l}; do 
    echo "${i@A}"
done

И ваш результат должен быть:

j='jjj'
k='kkk'
l='lll'

5

Или в zshиспользованииdeclare -p

% j=jjj; k=kkk; l=(l l l)               
% for v in j k l; do declare -p $v; done
typeset j=jjj
typeset k=kkk
typeset -a l=( l l l )
% 

3
тоже работает с
Стивен Пенни

2

Хотя ${!i}это и является более чистым и быстрым решением для полноты, косвенная ссылка также может быть получена с помощью следующего примера:

 foo=bar
 bar=baz
 $ echo $foo
 bar
 $ eval echo \$${foo}
 baz

Следовательно:

 j="jjj"
 k="kkk"
 l="lll"

 for i in {j,k,l}; do
   echo "$i = `eval echo \\$${i}`"
 done

дает:

 j = jjj
 k = kkk
 l = lll

Ссылки:

Косвенные ссылки

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.