Bash 스크립트 내에서 변수 할당

Bash 스크립트 내에서 변수 할당

이것은 분명히 SSCCE이므로 (그 자체로는) 의미가 없습니다. 예를 들어 Y, 이 최소 예제에서는 변수 할당이 사용되지 않습니다. 저는 단지 실제 상황에 맞는 올바른 구문을 찾으려고 노력하고 있습니다.

Bash 쉘에서 직접 다음을 수행할 수 있습니다.

Y=10 echo foo

bash 파일에 다음을 포함할 수도 있습니다 foo.sh.

#!/bin/bash
X="echo foo"
$X

...그런 다음 다음을 실행합니다.

$./foo.sh
foo

그러나 bash 파일에 다음이 있는 경우:

#!/bin/bash
X="Y=10 echo foo"
$X

...그러면 다음과 같은 결과가 나옵니다.

$ ./foo.sh 
./foo.sh: line 3: Y=10: command not found

위의 올바른 구문은 무엇입니까?

답변1

문제는 선택적 매개변수 할당이 인식된다는 점입니다.앞으로매개변수 확장이 발생하므로 라인

$X

이전 할당이 없는 명령으로 인식됩니다. 확장된 결과의 첫 번째 단어가 명령 이름이라고 가정하므로 쉘은 Y=10.

일반적으로 코드를 변수에 저장하지 말고 함수에 저장해야 합니다.

X () {
    Y=10 echo foo
}

답변2

아래에서 설명하는 내용은 사용된 부분을 생략한 최소한의 예시의 인공물임이 밝혀졌습니다 Y.

이 줄의 명령 앞에는 변수 할당이 나옵니다.

Y=10 echo foo

Y이 할당은 실행 중에 변수를 로 설정합니다 . 사용되지 않으므로 할당이 적용되지 않습니다.10echo fooecho fooY

이는 질문과 답변에 있는 이 명령의 모든 변형에서 동일합니다. Y=10거기에는 아무런 효과가 없습니다.

답변3

이 작업을 수행해야 하는 경우 다음을 사용하세요 env.

$ X='env Y=10 echo foo'
foo

...그리고 보여줘 $Y...

$ X='env Y=10 env'
$ $X | grep \^Y
Y=10

...하지만 기능은 더 좋습니다.

답변4

매개변수 확장이 발생한 후 명령을 다시 구문 분석하는 방법은 다음과 같습니다.

X="Y=10 echo foo"
eval "$X"

나는 당신이 이 일을 하고 싶어하는 현실적인 이유가 있다고 가정합니다.

관련 정보