버팀대 확장 전에 매개변수 확장을 수행하시겠습니까? [복사]

버팀대 확장 전에 매개변수 확장을 수행하시겠습니까? [복사]

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

$1and 값은 $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

이것이 당신이 찾은 것일 수도 있습니다!

관련 정보