Bash는 변수 할당을 명령으로 해석합니다.

Bash는 변수 할당을 명령으로 해석합니다.

지난 며칠 동안 뭔가를 시도했지만 막혔습니다. 문제를 어떻게 해결해도 계속 같은 문제가 발생합니다. 2개의 열이 있는 텍스트 파일이 있습니다. 첫 번째는 변수 이름이고 두 번째는 실행할 명령이며 출력은 첫 번째 열의 변수에 할당됩니다. 나는 일반적으로 read두 개의 열을 자체 변수에 할당한 다음 전체 표현식을 새 변수에 넣고 실행합니다. 내가 무엇을 하든 항상 명령 이름으로 표현식이 표시되고 "명령을 찾을 수 없습니다"라는 오류가 발생합니다.

조금 복잡해서 알려드리겠습니다. 스크립트는 다음과 같습니다

while read varName varCmd
do
        echo varName is $varName
        echo varCmd is $varCmd
        declare cmd=$varName=$varCmd
        echo Command is $cmd
        "$cmd"
        echo 1st Value is $varFoo
        echo 2nd Value is $varBar

done < testvars.txt

텍스트 파일은 다음과 같습니다.

varFoo  echo foo
varBar  echo bar

할당 실행 자체를 제외하고는 모든 것이 잘 작동합니다. 이것이 내가 얻는 것입니다:

varName is varFoo
varCmd is echo foo
Command is varFoo=echo foo
./testvars.sh: line 8: varFoo=echo foo: command not found
1st Value is
2nd Value is
varName is varBar
varCmd is echo bar
Command is varBar=echo bar
./testvars.sh: line 8: varBar=echo bar: command not found
1st Value is
2nd Value is

=Bash는 모든 것을 연산자 가 아닌 명령 이름(문자열)으로 해석하는 것 같습니다 .

Bash가 할당 표현식을 올바르게 해석하도록 하려면 어떻게 해야 합니까?

답변1

이는 이를 수행할 수 없는 방법과 유사합니다.

name=foo
"$name"=123

아니면 이거:

cmd="ls -l | grep ^d"
$cmd

할당 단어는 다음과 같이 식별됩니다.앞으로변수 확장 전에 다른 연산자가 해결되는 방식과 유사하게 변수가 확장됩니다(그리고 이후에는 인식되지 않습니다). 이것은 또한 다른 쉘이 수행하는 작업이고 표준에서 말하는 작업이므로 많은 의미에서 "올바른" 동작입니다.

다른 변수 내에서 명명된 변수를 참조하려면 namerefs(Bash 4.3부터)를 사용할 수 있으며 declare명령 자체도 이 작업을 수행할 수 있습니다. 이는 123다음이라는 변수에 할당됩니다 foo.

declare -n p=foo
p=123

또는

varname=foo
declare "$varname=123"

그러나 일반적으로 사용하는 것이 더 합리적입니다.연관 배열:

key=foo
value=123
declare -A aa
aa["$key"]="$value"

명령을 저장하려면 다음을 참조하세요.

답변2

예, eval을 사용하세요. 하지만 명령 문자열을 실행해야 합니다.

eval $varName=$($varCmd)

아니면 할 수 있습니다 ...

declare cmd="$varName=$($varCmd)"
eval $cmd

답변3

eval에 설명된 대로 을 사용합니다 man bash.

 eval $varBar

관련 정보