Bash 매뉴얼에는 중괄호 확장이 다른 확장보다 먼저 수행된다고 나와 있습니다.
저는 두 개의 매개변수를 허용하는 스크립트를 작성 중입니다.
#! /bin/bash
for b in {$1..$2}; do echo $b; done
나는 다음과 같이 실행합니다 :
$ ./myscript 0002 0010
{0002..0010}
출력이 내가 기대했던 것과 다릅니다. 중괄호 확장 전에 매개변수 확장을 수행하고 싶습니다. 내 예의 예상 결과는 0002 0003 0004 0005 0006 0007 0008 0009 0010
, no 입니다 2 3 4 5 6 7 8 9 10
. 대신 무엇을 사용 하시겠습니까 {$1..$2}
?
나는 이 솔루션이 숫자뿐만 아니라 문자와 숫자로 구성된 문자열 $1
에서도 작동하기를 원합니다 .$2
$1
and 값은 $2
스크립트에 대한 인수로만 제공될 수 있습니다. 처음부터 명확하다고 생각하지만 만일을 대비해 지적해 주시기 바랍니다.
답변1
요청한 대로 수행하십시오. 중괄호 확장 전에 매개변수 확장을 수행하십시오.
중괄호 확장을 지연해야 합니다. \{...\}
이를 인용하고 eval을 호출하면 쉽게 수행할 수 있습니다.
$ set -- 5 10
$ eval printf \'%s \' \{$1..$2\}
5 6 7 8 9 10
또는 에 명령이 없으면 $1
제대로 작동합니다 $2
.
이는 이 솔루션의 보안 위험입니다. 이 문제를 완화하는 한 가지 방법은 변수에 숫자만 포함되도록 하는 것입니다.
#!/bin/bash
a=${1//[^0-9]/} ### select only numbers from first parameter.
b=${2//[^0-9]/} ### select only numbers from second parameter.
c=$(eval printf \'%s \' \{$a..$b\})
for i in $c; do echo "$i"; done
위 코드에는 이 버전에서 수정된 일부 참조가 누락되었습니다.
#!/bin/bash
a=${1//[^0-9]/} ### select only numbers from first parameter.
b=${2//[^0-9]/} ### select only numbers from second parameter.
c=( $(eval printf \'%s \' \{$a..$b\}) )
for i in "${c[@]}"; do echo "$i"; done
### Or just
# printf '%s\n' "${c[@]}"
그러나 숫자 목록을 인쇄하려면 산술 for
루프가 더 나은 솔루션처럼 보입니다.
#!/bin/bash
a=${1//[^0-9]/} ### select only numbers from first parameter.
b=${2//[^0-9]/} ### select only numbers from second parameter.
for (( i=$a; i<=$b; i++)); do
printf '%0*d\n' 5 "$i"
done
다음과 같이 사용하세요:
$ script.sh 5 15
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
답변2
지원 확장POSIX에서 정의되지 않았으므로 완전히 삭제할 수도 있습니다.
seq $*
또는:
j=$1
while [ $j -le $2 ]
do
echo $j
j=$((j+1))
done
또는:
echo $* | awk '{for (j = $1; j <= $2; j++) print j}'
답변3
#! /bin/bash
seq -w $1 $2
이것이 당신이 찾은 것일 수도 있습니다!