변수 이름과 해당 값을 인쇄할 수 있는 방법이 있습니까?
j=jjj
k=kkk
l=lll
for i in j k l
do
....
done
예상 출력(각 변수마다 별도의 줄):
j = jjj
k = kkk
l = lll
누구든지 위의 결과를 얻을 수 있는 방법을 제안할 수 있습니까?
답변1
Bash의 간단한 방법:
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
Bash v4.4 이상이면 ${VAR@A}
매개변수 확산 연산자를 사용할 수 있습니다.
이 문제는 Bash 매뉴얼의 다음 섹션에서 논의됩니다.3.5.3 쉘 매개변수 확장
"A" 연산자
확장은 평가된 경우 매개 변수와 해당 속성 및 값을 다시 생성하는 할당 문 또는 선언 명령 형식의 문자열입니다.
따라서 다음을 수행할 수 있습니다.
j="jjj"
k="kkk"
l="lll"
for i in {j,k,l}; do
echo "${!i@A}"
done
결과는 다음과 같습니다.
j='jjj'
k='kkk'
l='lll'
답변3
또는 ksh
, zsh
또는 를 사용합니다 bash
. 보기 유형에 관심이 없는 경우 전역적으로 또는 개별적으로:yash
typeset -p
zsh
typeset
% j=jjj; k=kkk; l=(l l l)
% for v in j k l; do typeset -p "$v"; done
typeset j=jjj
typeset k=kkk
typeset -a l=( l l l )
(zsh에만 해당):
% typeset j k l
j=jjj
k=kkk
l=( l l l )
zsh에서 with 변형은 이 플래그가 있는 변수의 값을 -p
표시하지 않습니다 ( 일부 특수 매개변수의 경우와 마찬가지로).hideval
typeset -H
zsh
m
패턴과 일치하는 변수의 정의를 인쇄하는 것도 가능합니다 (함수나 옵션 세트 typeset -m
에도 작동합니다 ):typesetsilent
$ typeset -m '[j-l]'
j=jjj
k=kkk
l=( l l l )
답변4
표준 sh
구문에서는 다음과 같습니다.
j=jjj
k=kkk
l=lll
for i in j k l
do
eval 'printf "%s\n" "$i=${'"$i"'}"'
done
즉, 쉘은 확장을 연결하고 쉘 코드로 해석되도록 요청하므로 printf "%s\n" "$i=${
예를 들어 다음과 같이 해석됩니다.$i
}"
i=j
printf "%s\n" "$i=${j}"
이는 및 인수를 사용하여 명령을 eval
호출하는 데 사용되었습니다.printf
%s\n
j=jjj
일부 쉘에서는 중괄호가 필요합니다. i
예를 들어 10
일부 쉘에서는 where 값이 대신 $10
으로 해석됩니다 .${1}0
${10}
을 사용하면 출력이 j='foo; bar'
표시됩니다 . 쉘 코드 (zsh에서와 마찬가지로 ) i=foo; bar
를 사용하여 POSIXly를 사용하여 출력에 동일한 값을 할당하려면 다음을 수행할 수 있습니다.j
typeset -m j
show_var() (
for _var do
eval 'set -- "$@" "$_var" "${'"$_var"'}"'
shift
done
LC_ALL=C awk -v q="'" -- '
function shquote(s) {
gsub(q, "&\\\\&&", s)
return q s q
}
BEGIN {
for (i = 1; i < ARGC; i++) print ARGV[i]"="shquote(ARGV[++i])
}' "$@"
)
그런 다음:
show_var j k l