Bash에서 변수의 동적 대체

Bash에서 변수의 동적 대체

솔직히 이 질문을 어떻게 해야할지, 올바른 용어가 무엇인지도 모르겠습니다 ㅋㅋㅋ

그래서 제가 하고 싶은 것은 변수 이름을 가진 변수를 다루는 것입니다. 실제로 보여줌으로써 가장 잘 설명할 수 있을 것 같습니다. 이전에 제가 가지고 있던 것은 이것이었습니다.

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

관련 정보