답변:
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
ArrayLength=${#array[@]}
우리가 여기 대신에 그것을 사용합니까 어떻게 max
?
bash for
는 변수 (반복자)와 반복자가 반복 할 단어 목록으로 구성됩니다.
따라서 제한된 단어 목록이있는 경우 다음 구문에 입력하십시오.
for w in word1 word2 word3
do
doSomething($w)
done
아마도 일부 숫자를 따라 반복하고 싶을 것이므로 seq
명령을 사용하여 숫자 목록을 생성 할 수 있습니다. (예 : 1에서 100까지)
seq 1 100
FOR 루프에서 사용하십시오.
for n in $(seq 1 100)
do
doSomething($n)
done
$(...)
구문에 유의하십시오 . 그것은 당신이 (에서 우리의 경우 한 명령의 출력을 전달할 수, 강타 행동의 seq
다른를)합니다 ( for
)
이것은 어떤 경로의 모든 디렉토리를 반복해야 할 때 매우 유용합니다. 예를 들면 다음과 같습니다.
for d in $(find $somepath -type d)
do
doSomething($d)
done
목록 생성 가능성은 무한합니다.
bash
기본 제공 도움말을 사용해보십시오 .
$ help for
for: for NAME [in WORDS ... ;] do COMMANDS; done
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
omitted, it behaves as if it evaluates to 1.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
다음은 이전 셸에서도 작동 할 수있는 동시에 많은 수에 대해 효율적인 예입니다.
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
그러나 행운의 내부에 유용한 일을 awk
: 어떻게 내가 awk 스크립트에 쉘 변수를 사용합니까?
do
/ done
쌍 대신 중괄호를 사용하는 것입니다 .
나는 일반적으로 표준 for 루프에서 약간의 변형을 사용하는 것을 좋아합니다. 나는 종종 이것을 사용하여 일련의 원격 호스트에서 명령을 실행합니다. bash의 중괄호 확장을 이용하여 숫자가 아닌 for 루프를 만들 수있는 for 루프를 만듭니다.
예:
프런트 엔드 호스트 1-5와 백엔드 호스트 1-3에서 uptime 명령을 실행하고 싶습니다.
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"
done
나는 일반적으로 위의 읽기 쉬운 버전 대신 줄 끝에 세미콜론이있는 한 줄 명령으로 실행합니다. 주요 사용 고려 사항은 중괄호를 사용하면 문자열에 삽입 할 여러 값을 지정할 수 있고 (예 : pre {foo, bar} post 결과는 prefoopost, prebarpost가 됨) 이중 마침표를 사용하여 계수 / 시퀀스를 허용한다는 것입니다 (a. .z 등). 그러나 이중 마침표 구문은 bash 3.0의 새로운 기능입니다. 이전 버전은이를 지원하지 않습니다.
bash에서만 관심이있는 경우 위에 제시된 "for ((...))"솔루션이 가장 좋지만 모든 유니스에서 작동하는 POSIX SH 호환을 원한다면 "expr"을 사용해야합니다. "while", "(())"또는 "seq"또는 "i = i + 1"은 다양한 셸간에 이식 할 수 없기 때문입니다.
나는 파일을 처리하기 위해 항상 이것의 변형을 사용합니다 ...
* .log 파일의 경우; do echo "다음으로 작업 : $ files"; echo "$ files로 더 많은 작업 수행"; 끝난;
파일 목록 처리에 관심이있는 경우 파일 에 대한 -execdir 옵션을 살펴보십시오 .