답변:
다음과 같이 사용할 수 있습니다.
## declare an array variable
declare -a arr=("element1" "element2" "element3")
## now loop through the above array
for i in "${arr[@]}"
do
echo "$i"
# or do whatever with individual element of the array
done
# You can access them using echo "${arr[0]}", "${arr[1]}" also
여러 줄 배열 선언에도 작동
declare -a arr=("element1"
"element2" "element3"
"element4"
)
물론 가능합니다.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
자세한 내용은 while 및 until Bash Loops를 참조 하십시오.
for year in $(seq 2000 2013)
.
DATABASES="a b c d e f"
.
그 대답 중 어느 것도 카운터를 포함하지 않습니다 ...
#!/bin/bash
## declare an array variable
declare -a array=("one" "two" "three")
# get length of an array
arraylength=${#array[@]}
# use for loop to read all values and indexes
for (( i=1; i<${arraylength}+1; i++ ));
do
echo $i " / " ${arraylength} " : " ${array[$i-1]}
done
산출:
1 / 3 : one
2 / 3 : two
3 / 3 : three
echo "$i / ${arraylength} : ${array[$i-1]}"
.-그렇지 않으면 $i
glob가 포함되어 있으면 확장되고 탭이 포함되어 있으면 다음과 같이 변경됩니다. 공간 등
예
for Item in Item1 Item2 Item3 Item4 ;
do
echo $Item
done
산출:
Item1
Item2
Item3
Item4
공백을 보존하기 위해; 작은 따옴표 또는 큰 따옴표 목록 항목 및 큰 따옴표 목록 확장.
for Item in 'Item 1' 'Item 2' 'Item 3' 'Item 4' ;
do
echo "$Item"
done
산출:
Item 1
Item 2
Item 3
Item 4
여러 줄에 걸쳐 목록을 만들려면
for Item in Item1 \
Item2 \
Item3 \
Item4
do
echo $Item
done
산출:
Item1
Item2
Item3
Item4
단순 목록 변수
List=( Item1 Item2 Item3 )
또는
List=(
Item1
Item2
Item3
)
목록 변수를 표시하십시오.
echo ${List[*]}
산출:
Item1 Item2 Item3
목록을 반복합니다 :
for Item in ${List[*]}
do
echo $Item
done
산출:
Item1
Item2
Item3
목록을 살펴볼 함수를 작성하십시오.
Loop(){
for item in ${*} ;
do
echo ${item}
done
}
Loop ${List[*]}
선언 키워드 (명령)를 사용하여 기술적으로 배열이라고하는 목록을 만듭니다.
declare -a List=(
"element 1"
"element 2"
"element 3"
)
for entry in "${List[@]}"
do
echo "$entry"
done
산출:
element 1
element 2
element 3
연관 배열 만들기 사전 :
declare -A continent
continent[Vietnam]=Asia
continent[France]=Europe
continent[Argentina]=America
for item in "${!continent[@]}";
do
printf "$item is in ${continent[$item]} \n"
done
산출:
Argentina is in America
Vietnam is in Asia
France is in Europe
CVS 변수 또는 파일을 목록에 추가합니다 .
공간에서 내부 필드 구분 기호를 원하는대로 변경
아래 예에서 쉼표로 변경되었습니다
List="Item 1,Item 2,Item 3"
Backup_of_internal_field_separator=$IFS
IFS=,
for item in $List;
do
echo $item
done
IFS=$Backup_of_internal_field_separator
산출:
Item 1
Item 2
Item 3
번호를 매길 필요가있는 경우 :
`
이것을 백틱이라고합니다. 명령을 백틱 안에 넣습니다.
`commend`
키보드의 숫자 옆이나 탭 키 위에 있습니다. 표준 미국 영어 키보드.
List=()
Start_count=0
Step_count=0.1
Stop_count=1
for Item in `seq $Start_count $Step_count $Stop_count`
do
List+=(Item_$Item)
done
for Item in ${List[*]}
do
echo $Item
done
출력은 다음과 같습니다
Item_0.0
Item_0.1
Item_0.2
Item_0.3
Item_0.4
Item_0.5
Item_0.6
Item_0.7
Item_0.8
Item_0.9
Item_1.0
bash 동작에 더 익숙해지기 :
파일로리스트 만들기
cat <<EOF> List_entries.txt
Item1
Item 2
'Item 3'
"Item 4"
Item 7 : *
"Item 6 : * "
"Item 6 : *"
Item 8 : $PWD
'Item 8 : $PWD'
"Item 9 : $PWD"
EOF
목록 파일을 목록으로 읽고 표시
List=$(cat List_entries.txt)
echo $List
echo '$List'
echo "$List"
echo ${List[*]}
echo '${List[*]}'
echo "${List[*]}"
echo ${List[@]}
echo '${List[@]}'
echo "${List[@]}"
"${List[@]}"
, 올바른 것으로 따옴표와 함께 . ${List[@]}
잘못되었습니다. ${List[*]}
잘못되었습니다. 시도하십시오 List=( "* first item *" "* second item *" )
-에 대한 올바른 동작을 얻을 수 for item in "${List[@]}"; do echo "$item"; done
있지만 다른 변형은 아닙니다.
List=( "first item" "second item" )
으로 구분한다 first
, item
, second
, item
뿐만 아니라).
ls
, 출력 모범 사례의 위반을 .
4ndrew의 답변과 같은 정신으로 :
listOfNames="RA
RB
R C
RD"
# To allow for other whitespace in the string:
# 1. add double quotes around the list variable, or
# 2. see the IFS note (under 'Side Notes')
for databaseName in "$listOfNames" # <-- Note: Added "" quotes.
do
echo "$databaseName" # (i.e. do action / processing of $databaseName here...)
done
# Outputs
# RA
# RB
# R C
# RD
B. 이름에 공백이 없습니다.
listOfNames="RA
RB
R C
RD"
for databaseName in $listOfNames # Note: No quotes
do
echo "$databaseName" # (i.e. do action / processing of $databaseName here...)
done
# Outputs
# RA
# RB
# R
# C
# RD
노트
listOfNames="RA RB R C RD"
은 동일한 출력을가집니다.데이터를 가져 오는 다른 방법은 다음과 같습니다.
stdin에서 읽기
# line delimited (each databaseName is stored on a line)
while read databaseName
do
echo "$databaseName" # i.e. do action / processing of $databaseName here...
done # <<< or_another_input_method_here
IFS='\n'
: 또는 MacOS IFS='\r'
).#!/bin/bash
스크립트 파일의 맨 위에 포함 은 실행 환경을 나타냅니다.다른 소스 ( while read loop )
IFS
. 모든 사람에게 IFS
특정 구분 기호를 지정하면 하위 문자열로 구분되지 않고 다른 공백을 문자열에 포함시킬 수 있습니다.
$databaseName
전체 목록 만 포함하므로 단일 반복 만 수행합니다.
아무도 이것을 게시하지 않았다는 것에 놀랐습니다. 배열을 반복하는 동안 요소의 인덱스가 필요한 경우 다음을 수행 할 수 있습니다.
arr=(foo bar baz)
for i in ${!arr[@]}
do
echo $i "${arr[i]}"
done
산출:
0 foo
1 bar
2 baz
나는 이것이 "전통적인"for-loop 스타일 ( for (( i=0; i<${#arr[@]}; i++ ))
) 보다 훨씬 더 우아하다는 것을 안다 .
( ${!arr[@]}
그리고 $i
일부는 어쨌든 말을 인용 제안,하지만 그건 그냥 개인적인 취향입니다 때문에 그들이있는 거 단지 숫자를 인용 할 필요가 없습니다.)
이것은 또한 읽기 쉽다 :
FilePath=(
"/tmp/path1/" #FilePath[0]
"/tmp/path2/" #FilePath[1]
)
#Loop
for Path in "${FilePath[@]}"
do
echo "$Path"
done
IFS=$'\n'
.이 시나리오의 다른 솔루션에서도 작동 할 수 있습니다.
anubhava 의 정답 외에도 : 루프의 기본 구문이 다음과 같은 경우 :
for var in "${arr[@]}" ;do ...$var... ;done
이 특별한 경우는세게 때리다:
스크립트 또는 함수를 실행할 때 명령 행에 전달 된 인수 는 $@
배열 변수에 지정 되며 $1
,, $2
등으로 액세스 할 수 있습니다 $3
.
이것은 다음을 통해 (테스트를 위해) 채울 수 있습니다
set -- arg1 arg2 arg3 ...
이 배열에 대한 루프 는 다음과 같이 간단하게 작성할 수 있습니다.
for item ;do
echo "This is item: $item."
done
참고 예약 된 작업을하는 것이 in
존재하지없이 배열 이름도!
견본:
set -- arg1 arg2 arg3 ...
for item ;do
echo "This is item: $item."
done
This is item: arg1.
This is item: arg2.
This is item: arg3.
This is item: ....
이것은 다음과 같습니다
for item in "$@";do
echo "This is item: $item."
done
#!/bin/bash
for item ;do
printf "Doing something with '%s'.\n" "$item"
done
스크립트에서이 내용을 저장 myscript.sh
, chmod +x myscript.sh
다음,
./myscript.sh arg1 arg2 arg3 ...
Doing something with 'arg1'.
Doing something with 'arg2'.
Doing something with 'arg3'.
Doing something with '...'.
myfunc() { for item;do cat <<<"Working about '$item'."; done ; }
그때
myfunc item1 tiem2 time3
Working about 'item1'.
Working about 'tiem2'.
Working about 'time3'.
Korn 쉘에서는 선언 배열이 작동하지 않습니다. Korn 쉘에 아래 예제를 사용하십시오.
promote_sla_chk_lst="cdi xlob"
set -A promote_arry $promote_sla_chk_lst
for i in ${promote_arry[*]};
do
echo $i
done
for i in ${foo[*]}
기본적으로 항상 잘못된 것입니다- for i in "${foo[@]}"
원래 목록의 경계를 유지하고 glob 확장을 방지하는 형식입니다. 그리고 반향이 필요합니다echo "$i"
Korn 쉘을 사용중인 경우 " set -A databaseName "이 있고 그렇지 않으면 " 선언 -a databaseName "이 있습니다.
모든 쉘에서 작동하는 스크립트를 작성하려면
set -A databaseName=("db1" "db2" ....) ||
declare -a databaseName=("db1" "db2" ....)
# now loop
for dbname in "${arr[@]}"
do
echo "$dbname" # or whatever
done
모든 껍질에서 작동해야합니다.
$ bash --version
GNU bash는 버전 4.3.33 (0) -release (AMD64-portbld-freebsd10.0) $ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
배쉬 : 근처에 구문 오류가 예기치 않은 토큰 '('
이 시도. 작동하고 테스트되었습니다.
for k in "${array[@]}"
do
echo $k
done
# For accessing with the echo command: echo ${array[0]}, ${array[1]}
array=( "hello world" )
하거나 arrray=( "*" )
; 첫 번째 경우에는 별도로 인쇄 hello
되고 world
두 번째 경우에는*
단일 회선 루핑,
declare -a listOfNames=('db_a' 'db_b' 'db_c')
for databaseName in ${listOfNames[@]}; do echo $databaseName; done;
다음과 같은 결과가 나옵니다.
db_a
db_b
db_c
git pull
업데이트를 위해 프로젝트 배열을 반복합니다 .
#!/bin/sh
projects="
web
ios
android
"
for project in $projects do
cd $HOME/develop/$project && git pull
end