bash에서 값이 포함된 문자열을 명령으로 실행하는 방법은 무엇입니까?

bash에서 값이 포함된 문자열을 명령으로 실행하는 방법은 무엇입니까?

여기 내 bash 스크립트의 작은 조각이 있습니다.

i=5
command='echo $i'
$command

이 스크립트를 인쇄하고 싶습니다 5. 즉, echo를 실행하고 5를 인쇄하고 싶습니다. 하지만 계속해서 인쇄됩니다 $i. 그렇다면 이 문제를 어떻게 해결해야 할까요?

답변1

그것은 다음과 같습니다:

eval "$command"

콘텐츠를 $command쉘 코드로 평가하려는 경우.

$command시작되지 않을 것이라고 보장할 수 없는 경우 -(이로 인해 eval일부 쉘에서는 bash옵션으로 처리됨 ) 다음을 실행할 수 있습니다.

eval " $command"

대신에. 추가 선행 공백은 명령이 구문 분석되는 방식에 영향을 미치지 않으며 명령이 . 로 끝나는 $command경우 일부 쉘( . 포함)에서 작동 하지만 POSIX(IIRC)가 아니며 Bourne 쉘에서는 작동하지 않습니다.eval-eval -- "$command"bashdash

아마도 다음과 $command같아야 합니다.

command='echo "$i"'

$i실제로 분할+글로브를 사용할 계획이 없다면

"변수"에 코드를 저장하는 더 좋은 방법은 함수를 사용하는 것입니다.

mycommand() { echo "$i"; }

( 이미 기존 명령 이므로 mycommand대신 사용하십시오.)commandcommand

$command// break인 경우 동작 continuereturn셸에 따라 달라집니다.

$command저장 하고 싶다면간단한 명령, 첫 번째 단어가 단어 목록을 인수로 사용하여 실행되는 명령으로 조회되는 단어 목록인 경우 배열 변수를 사용할 수 있습니다.

command=('echo' '$i' "$i")
"${command[@]}"

이는 run 의 내용을 인수 로 사용합니다 echo.echo$i$i

command='echo $i ;x /* '$i
$command

(기본값은 $IFS)은 가장 의미가 없습니다. 거기에는 $command문자열이 포함됩니다. 첫 번째 것은 $i그대로 남아 있고, 두 번째 것은 확장됩니다(작은따옴표 외부에서와 같이). 그런 다음 문자열은 분할+glob의 영향을 받습니다( $command큰따옴표 안에 있지 않기 때문에). 그 결과는 많은 단어가 됩니다. 하나로 받아들인간단한 명령다시.

관련 정보