변수가 [중복]인 경우 bash 스크립트

변수가 [중복]인 경우 bash 스크립트

값을 확인하고 싶은 변수 이름에 변수를 어떻게 추가하나요? 내 코드는 다음과 같으며 실행하면 오류가 발생합니다.

[: 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는 수학 표현식용이지만 문자열을 비교하는 것입니다.

문자열을 비교하려면 를 사용하세요 =.

관련 정보