
솔직히 이 질문을 어떻게 해야할지, 올바른 용어가 무엇인지도 모르겠습니다 ㅋㅋㅋ
그래서 제가 하고 싶은 것은 변수 이름을 가진 변수를 다루는 것입니다. 실제로 보여줌으로써 가장 잘 설명할 수 있을 것 같습니다. 이전에 제가 가지고 있던 것은 이것이었습니다.
if [ -z ${file_var} ]; then
echo "empty argument"
fi
if [ -z ${pw_var} ]; then
echo "empty argument"
fi
따라서 두 개의 if 문을 사용하는 대신 다음과 같이 하나의 for 루프만 사용하고 싶습니다.
for i in file_var, pw_var;do
if [ -z ${${i}} ]; then
echo "empty argument"
fi
done
이제 이것은 분명히 작동하지 않으므로 올바르게 수행하는 방법이 궁금합니다.
답변1
당신이 하고 싶은 일은간접 확장, Bash는 다음을 지원합니다.!
:
if [ -z "${!i}" ] ; then
첫 번째 문자가 다음과 같은 경우범위는 느낌표(
!
)이고,범위하나도 아니야이름 참조, 이는 간접 수준을 도입합니다. Bash는 나머지를 확장하여 형성된 값을 사용합니다.범위그런 다음 새 인수로 확장되고 해당 값은 원래 인수의 확장이 아닌 나머지 확장에 사용됩니다. 이것은 ... 불리운다간접 확장.
이 경우 "${!i}"
변수의 모든 값으로 확장됩니다 .이름에 저장되어 i
간접적 -z
으로 액세스된 값을 테스트합니다.
또는이름 참조자동으로 이런 식으로 동작하는 특별한 유형의 변수입니다. 너다음을 사용하여 nameref 변수를 만듭니다.declare -n name
, 그 이후
에 대한 모든 참조, 할당 및 속성 수정
name
(속성 자체를 사용하거나 변경하는 경우는 제외-n
)은 값이 참조하는 변수에서 수행됩니다name
.
그래서 추가하면
declare -n i
루프 이전에 이는 다음을 의미합니다.
for i in file_var pw_var
do
if [ -z "$i" ]
then
...
fi
done
원하는 방식으로 작동합니다. 하지만 참고하세요작업i
(이와 같은 루프로 설정하는 것과는 반대로) 대상 변수를 수정합니다 .
for
또한 질문에 쓴 것처럼 Bash 루프에서 반복하는 항목 사이에는 쉼표가 없습니다 .
답변2
이 코드는 작동합니다. file_var 또는 pw_var이 비어 있으면 특정 변수가 비어 있다고 인쇄합니다. 사용 사례에 맞게 조정할 수 있습니다.
file_var=""
pw_var=""
for i in 'file_var' 'pw_var';do
if [ -z ${!i} ]; then
echo "$i is empty"
fi
done