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의 답변.