bash에서 값을 사용하여 문자열을 명령으로 실행하는 방법은 무엇입니까?

bash에서 값을 사용하여 문자열을 명령으로 실행하는 방법은 무엇입니까?

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

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

나는 이 스크립트를 인쇄하기를 원합니다 5. 즉, echo를 실행하고 5를 인쇄하기를 원합니다. 하지만 대신 인쇄를 계속합니다 $i. 그럼 이 문제를 어떻게 해결해야 할까요?

답변1

그것은 다음과 같습니다:

eval "$command"

내용을 $command쉘 코드로 평가하려는 경우.

$command시작하지 않을 것이라고 보장할 수 없는 경우 ( 일부 쉘에서는 이를 옵션으로 취급하게 -됨 ) 다음을 실행하는 것이 좋습니다.evalbash

eval " $command"

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

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

command='echo "$i"'

$i분할+글로브의 대상이 될 의도가 없었다면

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

mycommand() { echo "$i"; }

( 이미 기존 명령이므로 대신 mycommand사용 )commandcommand

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

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

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

그러면 echo, with echo$i의 내용이 $i인수로 실행됩니다.

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

(기본값 $IFS)은 가장 의미가 없는 것입니다. 거기에는 $command문자열이 포함됩니다. 첫 번째는 $i그대로 남아 있고 두 번째는 확장되어(작은 따옴표 외부로) 해당 문자열은 분할+글로브(큰 따옴표 내부가 아님)의 적용을 받으며 $command그 결과 다음과 같은 여러 단어가 생성됩니다. 로서간단한 명령다시.

관련 정보