값을 확인하고 싶은 변수 이름에 변수를 어떻게 추가하나요? 내 코드는 다음과 같으며 실행하면 오류가 발생합니다.
[: A_variable: integer expression expected
변수에 대해 if를 수행할 때 올바른 구문은 다음과 같아야 하기 때문이라고 생각합니다. if [ $A_variable -eq 1 ]; 하지만 다른 변수를 넣기 때문에 변수 앞에 달러 기호를 넣을 수 없습니다.
거의 다음과 같습니다: if [ $${letter}_variable 또는 일부 혼합이지만 무엇을 모르겠습니다.
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
if [ ${letter}_variable -eq 1 ]; then
...
답변1
이것은 ... 불리운다간접 확장배쉬에서.
다른 변수에 의해 이름이 결정되는 변수의 값을 가져오는 구문은 다음 namevar
과 같습니다.
${!namevar}
변수 이름은 변수와 상수 문자열로 구성되므로 중간 단계가 필요합니다.
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
varname="${letter}_variable"
if [ "${!varname}" -eq 1 ]; then
...
노트:간접적으로 참조된 변수가 실제로 존재하지 않는 경우 확장하면 빈 문자열이 생성되고 여전히 오류가 발생합니다. 이것이 바람직하지 않은 경우 먼저 다음과 같은 두 번째 테스트를 추가하십시오.
varname="${letter}_variable"
if [ "${!varname}" = "" ]; then
echo "Error: $varname is non-existent or empty"
elif [ "${!varname}" -eq 1 ]; then
...
추가적으로, 일치 가능한 모든 변수의 내용이 미리 안전한 값으로 초기화되지 않은 경우, 확장된 결과에 예상치 못한 문자가 나오는 것을 방지하기 위해 큰따옴표를 사용하는 것이 좋을 것입니다.
답변2
문자열("A_variable")을 정수("1")와 비교하고 있습니다.
를 사용하여 이 문제를 해결할 수 있습니다 declare -n
. 에서 help declare
:
-n은 NAME을 값의 이름이 지정된 변수에 대한 참조로 만듭니다.
[[ .. ]]
"C_variable"이 설정되지 않아 발생하는 오류를 피해야 합니다 .
#!/bin/bash
array=("A" "B" "C")
A_variable=1
B_variable=2
for letter in "${array[@]}"
do
declare -n foo="${letter}_variable"
if [[ "$foo" -eq 1 ]]; then
echo "Ding"
fi
done
보너스: declare -i A_variable=1
정수로 만들 수 있습니다.
-i는 NAME에 "정수" 속성을 갖도록 만듭니다.
답변3
이 연산자 -eq
는 수학 표현식용이지만 문자열을 비교하는 것입니다.
문자열을 비교하려면 를 사용하세요 =
.