올바른 솔루션

올바른 솔루션

저는 두 개의 매개변수를 허용하는 스크립트를 작성 중입니다.

#! /bin/bash

eval  for i in {$1..$2}; do echo $i;  done

나는 다음과 같이 실행합니다 :

$ ./myscript 0002 0010
 syntax error near unexpected token `do'

이 오류는 왜 발생합니까?

루프가 그룹화되어야하기 때문일 수 있다고 생각합니다. 하지만 eval for i in {$1..$2}; do echo $i; done으로 바꾸면 eval { for i in {$1..$2}; do echo $i; done; }오류가 여전히 존재합니다.

참고: 중괄호 확장 이전에 사용하고 싶습니다 eval. 내 예에서 원하는 출력은 입니다 0002 0003 0004 0005 0006 0007 0008 0009 0010.버팀대 확장 전에 매개변수 확장을 수행하시겠습니까?)

답변1

그 이유는 쉘이 이를 평가하기 ;때문에 eval이를 볼 수 없기 때문입니다.

평가를 지연시키려면 쉘 특수 문자를 이스케이프해야 하며 문자 그대로 전달하면 다음을 의미합니다 eval.

eval for i in \{"$1".."$2"\}\; do echo \"\$i\"\;  done

답변2

줄은 첫 번째 메타문자 ;(이 예에서는)에서 분리됩니다.
은행:

eval for i in {$1..$2}; do echo $i;  done

세 가지 명령으로 나누어집니다.

eval for i in {$1..$2};
do echo $i;
done

do이전 for, , while없이 a를 실행 하려고 하면 until작동하지 않습니다. 오류 조건이 발생합니다.

예상치 못한 마커 'do' 근처에 구문 오류가 있습니다.

이는 이전 항목이 for명령의 매개변수로 숨겨져 있기 때문에 발생합니다 eval.

가능한 해결 방법은 모든 것을 인용하고 확장하려는 항목만 생략하는 것입니다. 변수 $1와 다음이 필요하다고 생각합니다 $2.

eval 'for i in {'$1'..'$2'}; do echo $i;  done'

그것은 작동합니다 :

$ ./myscript 0002 0010
0002
0003
0004
0005
0006
0007
0008
0009
0010

그러나 이 스크립트는 eval외부 입력을 사용하므로 매우 안전하지 않습니다.

올바른 솔루션

더 안전한 스크립트는 다음과 같이 $1 및 $2를 삭제하고 변수를 올바르게 참조합니다.

#!/bin/bash
a=${1//[^0-9]/}          ### select only numbers from first parameter.
b=${2//[^0-9]/}          ### select only numbers from second parameter.
eval  'for i in {'"$a"'..'"$b"'}; do echo $i;  done'

관련 정보