bash의 for 루프에서 입력 매개변수를 정수 값으로 변환하는 방법은 무엇입니까? [복사]

bash의 for 루프에서 입력 매개변수를 정수 값으로 변환하는 방법은 무엇입니까? [복사]

for내 bash 스크립트에서 루프의 입력 변수로 숫자를 사용하려고하는데 다음과 같이 스크립트를 실행합니다.

./script.sh InputFolder/ Number_of_iterations

Number_of_iterations스크립트는 지정된 폴더 내에서 실행되어야 하며 변수가 설정된 횟수에 따라 for 루프를 실행해야 합니다. 하지만 어떻게 든 변수를 정수로 설정할 수 없습니다.

다음은 스크립트에 있는 루프의 예입니다.

for i in {1..$(($2))}
do
 echo "Welcome $i times"
done

$(($...))이중 괄호 옵션과 큰 따옴표를 시도했지만 "..."계속해서 나타나는 결과는 다음과 같습니다.

Welcome {1..5} times

이것은 나에게 이것이 정수가 아니라고 생각하게 만듭니다. 입력 매개변수를 스크립트에 정수로 읽어주시면 감사하겠습니다.

답변1

이 작업은 두 가지 방법으로 수행할 수 있습니다.

ksh93 호환 쉘(ksh93, zsh, bash)을 사용하십시오.

for (( i=1;i<=$2;i++ ))
do
 echo "Welcome $i times"
done

여기서는 i를 1로 설정하고 $2보다 작거나 같을 때까지 증가시켜 다음을 출력합니다.

Welcome 1 times
Welcome 2 times

GNU 시스템에서 POSIX 쉘 사용:

for i in $(seq "$2")
do
 echo "Welcome $i times"
done

seq명령(GNU 특정)은 $2에 지정된 숫자를 1부터 $2까지 별도의 줄에 인쇄합니다. 명령 대체는 수정하지 않은 경우 $IFS(기본적으로 줄 구분 기호 포함)를 for반복하려는 만큼의 요소 로 분할합니다.

답변2

큰 타격을 입은 상태에서사용하려는 구성은 다음과 같습니다. {1..$(($2))}또는 {1..$2}중괄호 확장입니다. 이것이 작동하지 않는 이유는 쉘 확장 순서에서 중괄호 확장이 먼저 오기 때문입니다. 따라서 이 확장이 언제 발생하는지는 $2여전히 문제 $2이며 5원하는 대로가 아닙니다. 그러면 버팀대 확장이 작동하지 않습니다. 단지 생성한 1..$2다음 확장해야 할 때 $2쉘이 이를 수행하고 다음 단어만 남습니다.

{1..5}

중괄호는 중괄호 확장에 의해 소모되지 않기 때문에 여전히 존재합니다.

해결 방법은 다음을 참조하세요.Raman Sailopal의 답변.

관련 정보