여기 내 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"
bash
dash
아마도 다음과 $command
같아야 합니다.
command='echo "$i"'
$i
실제로 분할+글로브를 사용할 계획이 없다면
"변수"에 코드를 저장하는 더 좋은 방법은 함수를 사용하는 것입니다.
mycommand() { echo "$i"; }
( 이미 기존 명령 이므로 mycommand
대신 사용하십시오.)command
command
$command
// break
인 경우 동작 continue
은 return
셸에 따라 달라집니다.
$command
저장 하고 싶다면간단한 명령, 첫 번째 단어가 단어 목록을 인수로 사용하여 실행되는 명령으로 조회되는 단어 목록인 경우 배열 변수를 사용할 수 있습니다.
command=('echo' '$i' "$i")
"${command[@]}"
이는 run 의 내용을 인수 로 사용합니다 echo
.echo
$i
$i
command='echo $i ;x /* '$i
$command
(기본값은 $IFS
)은 가장 의미가 없습니다. 거기에는 $command
문자열이 포함됩니다. 첫 번째 것은 $i
그대로 남아 있고, 두 번째 것은 확장됩니다(작은따옴표 외부에서와 같이). 그런 다음 문자열은 분할+glob의 영향을 받습니다( $command
큰따옴표 안에 있지 않기 때문에). 그 결과는 많은 단어가 됩니다. 하나로 받아들인간단한 명령다시.