Câu trả lời:
Bạn có thể sử dụng nó như thế này:
## 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
Cũng hoạt động cho khai báo mảng nhiều dòng
declare -a arr=("element1"
"element2" "element3"
"element4"
)
Điều đó là có thể, tất nhiên.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Xem Bash Loops, trong khi và cho đến khi biết chi tiết.
for year in $(seq 2000 2013)
.
DATABASES="a b c d e f"
.
Không có câu trả lời nào trong số đó bao gồm một bộ đếm ...
#!/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
Đầu ra:
1 / 3 : one
2 / 3 : two
3 / 3 : three
echo "$i / ${arraylength} : ${array[$i-1]}"
- nếu không, nếu bạn $i
chứa một quả địa cầu thì nó sẽ được mở rộng, nếu nó chứa một tab thì nó sẽ được thay đổi thành một không gian, v.v.
Đúng
for Item in Item1 Item2 Item3 Item4 ;
do
echo $Item
done
Đầu ra:
Item1
Item2
Item3
Item4
Để bảo tồn không gian; danh sách trích dẫn đơn hoặc đôi và mở rộng danh sách báo giá kép.
for Item in 'Item 1' 'Item 2' 'Item 3' 'Item 4' ;
do
echo "$Item"
done
Đầu ra:
Item 1
Item 2
Item 3
Item 4
Để tạo danh sách qua nhiều dòng
for Item in Item1 \
Item2 \
Item3 \
Item4
do
echo $Item
done
Đầu ra:
Item1
Item2
Item3
Item4
Biến danh sách đơn giản
List=( Item1 Item2 Item3 )
hoặc là
List=(
Item1
Item2
Item3
)
Hiển thị biến danh sách:
echo ${List[*]}
Đầu ra:
Item1 Item2 Item3
Lặp lại danh sách:
for Item in ${List[*]}
do
echo $Item
done
Đầu ra:
Item1
Item2
Item3
Tạo một chức năng để đi qua một danh sách:
Loop(){
for item in ${*} ;
do
echo ${item}
done
}
Loop ${List[*]}
Sử dụng từ khóa khai báo (lệnh) để tạo danh sách, về mặt kỹ thuật được gọi là một mảng:
declare -a List=(
"element 1"
"element 2"
"element 3"
)
for entry in "${List[@]}"
do
echo "$entry"
done
Đầu ra:
element 1
element 2
element 3
Tạo một mảng kết hợp. Một cuốn từ điển:
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
Đầu ra:
Argentina is in America
Vietnam is in Asia
France is in Europe
CVS biến hoặc tập tin vào một danh sách .
Thay đổi dấu phân cách trường bên trong từ một khoảng trắng, thành những gì bạn muốn.
Trong ví dụ dưới đây, nó được thay đổi thành dấu phẩy
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
Đầu ra:
Item 1
Item 2
Item 3
Nếu cần đánh số chúng:
`
đây được gọi là đánh dấu lại. Đặt lệnh bên trong tick lại.
`commend`
Nó nằm cạnh số một trên bàn phím của bạn và hoặc trên phím tab. Trên bàn phím tiếng Anh chuẩn của người Mỹ.
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
Đầu ra là:
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
Làm quen với hành vi bash:
Tạo một danh sách trong một tập tin
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
Đọc tệp danh sách vào một danh sách và hiển thị
List=$(cat List_entries.txt)
echo $List
echo '$List'
echo "$List"
echo ${List[*]}
echo '${List[*]}'
echo "${List[*]}"
echo ${List[@]}
echo '${List[@]}'
echo "${List[@]}"
Hướng dẫn tham khảo dòng lệnh BASH: Ý nghĩa đặc biệt của các ký tự hoặc từ nhất định đối với shell.
"${List[@]}"
chính xác, với các trích dẫn . ${List[@]}
sai. ${List[*]}
sai. Hãy thử List=( "* first item *" "* second item *" )
- bạn sẽ có hành vi đúng for item in "${List[@]}"; do echo "$item"; done
, nhưng không phải từ bất kỳ biến thể nào khác.
List=( "first item" "second item" )
sẽ bị phá vỡ vào first
, item
, second
, item
cũng).
ls
đầu ra, trái với các thực tiễn tốt nhất .
Theo tinh thần như câu trả lời của 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. Không có khoảng trắng trong tên:
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
Ghi chú
listOfNames="RA RB R C RD"
có cùng một đầu ra.Các cách khác để mang lại dữ liệu bao gồm:
Đọc từ 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'
: hoặc cho MacOS IFS='\r'
)#!/bin/bash
ở đầu tập tin kịch bản chỉ ra môi trường thực thi.Các nguồn khác ( trong khi đọc vòng lặp )
IFS
. (Đối với mọi người, hãy IFS
cho phép một người chỉ định một dấu phân cách cụ thể, cho phép các khoảng trắng khác được bao gồm trong các chuỗi mà không bị tách thành các chuỗi con).
$databaseName
chỉ chứa toàn bộ danh sách, do đó chỉ thực hiện một lần lặp duy nhất.
Bạn có thể sử dụng cú pháp của ${arrayName[@]}
#!/bin/bash
# declare an array called files, that contains 3 values
files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
for i in "${files[@]}"
do
echo "$i"
done
Ngạc nhiên là chưa có ai đăng cái này - nếu bạn cần các chỉ số của các phần tử trong khi bạn đang lặp qua mảng, bạn có thể làm điều này:
arr=(foo bar baz)
for i in ${!arr[@]}
do
echo $i "${arr[i]}"
done
Đầu ra:
0 foo
1 bar
2 baz
Tôi thấy điều này thanh lịch hơn nhiều so với kiểu vòng lặp "truyền thống" ( for (( i=0; i<${#arr[@]}; i++ ))
).
( ${!arr[@]}
và $i
không cần được trích dẫn vì chúng chỉ là những con số; một số người sẽ đề nghị trích dẫn chúng bằng mọi cách, nhưng đó chỉ là sở thích cá nhân.)
Điều này cũng dễ đọc:
FilePath=(
"/tmp/path1/" #FilePath[0]
"/tmp/path2/" #FilePath[1]
)
#Loop
for Path in "${FilePath[@]}"
do
echo "$Path"
done
IFS=$'\n'
Điều này cũng có thể hoạt động cho các giải pháp khác trong kịch bản này.
Ngoài câu trả lời đúng của anubhava : Nếu cú pháp cơ bản cho vòng lặp là:
for var in "${arr[@]}" ;do ...$var... ;done
có một trường hợp đặc biệt trongbash:
Khi chạy một kịch bản hay một chức năng, lập luận thông qua tại dòng lệnh sẽ được gán cho $@
biến mảng, bạn có thể truy cập bằng cách $1
, $2
, $3
, và vân vân.
Điều này có thể được xác định (để kiểm tra) bởi
set -- arg1 arg2 arg3 ...
Một vòng lặp trên mảng này có thể được viết đơn giản:
for item ;do
echo "This is item: $item."
done
Lưu ý rằng công việc dành riêng in
không có mặt và không có tên mảng quá!
Mẫu vật:
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: ....
Lưu ý rằng điều này giống với
for item in "$@";do
echo "This is item: $item."
done
#!/bin/bash
for item ;do
printf "Doing something with '%s'.\n" "$item"
done
Lưu này trong một kịch bản myscript.sh
, chmod +x myscript.sh
thì
./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 ; }
Sau đó
myfunc item1 tiem2 time3
Working about 'item1'.
Working about 'tiem2'.
Working about 'time3'.
Cách đơn giản :
arr=("sharlock" "bomkesh" "feluda" ) ##declare array
len=${#arr[*]} # it returns the array length
#iterate with while loop
i=0
while [ $i -lt $len ]
do
echo ${arr[$i]}
i=$((i+1))
done
#iterate with for loop
for i in $arr
do
echo $i
done
#iterate with splice
echo ${arr[@]:0:3}
Mảng khai báo không hoạt động cho shell Korn. Sử dụng ví dụ dưới đây cho vỏ 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[*]}
về cơ bản luôn luôn là điều sai - for i in "${foo[@]}"
là hình thức bảo tồn ranh giới của danh sách ban đầu và ngăn chặn sự mở rộng toàn cầu. Và tiếng vang cần phải cóecho "$i"
Nếu bạn đang sử dụng shell Korn, có " set -A databaseName ", khác là " khai báo -a databaseName "
Để viết một kịch bản làm việc trên tất cả các shell,
set -A databaseName=("db1" "db2" ....) ||
declare -a databaseName=("db1" "db2" ....)
# now loop
for dbname in "${arr[@]}"
do
echo "$dbname" # or whatever
done
Nó nên được làm việc trên tất cả các vỏ.
$ bash --version
GNU bash, phiên bản 4.3.33 (0) -release (amd64-portbld-freebsd10.0) $ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
bash: lỗi cú pháp gần mã thông báo bất ngờ `('
Thử cái này. Nó đang làm việc và thử nghiệm.
for k in "${array[@]}"
do
echo $k
done
# For accessing with the echo command: echo ${array[0]}, ${array[1]}
array=( "hello world" )
, hoặc arrray=( "*" )
; trong trường hợp đầu tiên, nó sẽ in hello
và world
riêng rẽ, trong lần thứ hai, nó sẽ in một danh sách các tệp thay vì*
Vòng lặp đơn,
declare -a listOfNames=('db_a' 'db_b' 'db_c')
for databaseName in ${listOfNames[@]}; do echo $databaseName; done;
bạn sẽ nhận được một đầu ra như thế này,
db_a
db_b
db_c
Những gì tôi thực sự cần cho việc này là một cái gì đó như thế này:
for i in $(the_array); do something; done
Ví dụ:
for i in $(ps -aux | grep vlc | awk '{ print $2 }'); do kill -9 $i; done
(Sẽ giết tất cả các quy trình với vlc trong tên của họ)
Tôi lặp qua một loạt các dự án của tôi để git pull
cập nhật:
#!/bin/sh
projects="
web
ios
android
"
for project in $projects do
cd $HOME/develop/$project && git pull
end