
여기 내 작은 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[@]}"
그러면 echo
, with echo
및 $i
의 내용이 $i
인수로 실행됩니다.
command='echo $i ;x /* '$i
$command
(기본값 $IFS
)은 가장 의미가 없는 것입니다. 거기에는 $command
문자열이 포함됩니다. 첫 번째는 $i
그대로 남아 있고 두 번째는 확장되어(작은 따옴표 외부로) 해당 문자열은 분할+글로브(큰 따옴표 내부가 아님)의 적용을 받으며 $command
그 결과 다음과 같은 여러 단어가 생성됩니다. 로서간단한 명령다시.