Saya ingin menulis skrip yang loop melalui 15 string (array mungkin?) Apakah itu mungkin?
Sesuatu seperti:
for databaseName in listOfNames
then
# Do something
end
Anda bisa menggunakannya seperti ini:
## 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
Juga berfungsi untuk deklarasi array multi-line
declare -a arr=("element1"
"element2" "element3"
"element4"
)
Itu mungkin, tentu saja.
for databaseName in a b c d e f; do
# do something like: echo $databaseName
done
Lihat Bash Loops untuk, sementara dan sampai untuk detailnya.
for year in $(seq 2000 2013)
.DATABASES="a b c d e f"
,.Tak satu pun dari jawaban itu termasuk penghitung ...
Keluaran:
sumber
echo "$i / ${arraylength} : ${array[$i-1]}"
- jika tidak, jika Anda$i
mengandung bola dunia itu akan diperluas, jika mengandung tab itu akan berubah menjadi ruang, dll.Iya
Keluaran:
Untuk melestarikan ruang; entri daftar kutipan tunggal atau ganda dan ekspansi daftar kutipan ganda.
Keluaran:
Untuk membuat daftar lebih dari beberapa baris
Keluaran:
Variabel daftar sederhana
atau
Tampilkan variabel daftar:
Keluaran:
Loop melalui daftar:
Keluaran:
Buat fungsi untuk menelusuri daftar:
Menggunakan kata kunci mendeklarasikan (perintah) untuk membuat daftar, yang secara teknis disebut array:
Keluaran:
Membuat array asosiatif. Sebuah kamus:
Keluaran:
Variabel CVS atau file dalam daftar .
Mengubah pemisah bidang internal dari ruang, ke apa pun yang Anda inginkan.
Dalam contoh di bawah ini diubah menjadi koma
Keluaran:
Jika perlu memberi nomor:
ini disebut centang kembali. Masukkan perintah di dalam kutu kembali.
Itu di sebelah nomor satu di keyboard Anda dan atau di atas tombol tab. Pada keyboard bahasa Inggris standar Amerika.
Output adalah:
Menjadi lebih akrab dengan perilaku bashes:
Buat daftar di file
Baca file daftar ke daftar dan tampilan
Manual referensi baris perintah BASH: Arti khusus karakter atau kata-kata tertentu untuk shell.
sumber
"${List[@]}"
benar, dengan kutipan .${List[@]}
salah.${List[*]}
salah. CobaList=( "* first item *" "* second item *" )
- Anda akan mendapatkan perilaku yang benar untukfor item in "${List[@]}"; do echo "$item"; done
, tetapi tidak dari varian lain.List=( "first item" "second item" )
akan dipecah menjadifirst
,item
,second
,item
juga).ls
output, bertentangan dengan praktik terbaik .Dengan semangat yang sama dengan jawaban 4ndrew:
B. Tidak ada spasi putih dalam nama:
Catatan
listOfNames="RA RB R C RD"
memiliki output yang sama.Cara lain untuk memasukkan data meliputi:
Baca dari stdin
IFS='\n'
, atau untuk MacOSIFS='\r'
)#!/bin/bash
di bagian atas file skrip menunjukkan lingkungan eksekusi.Sumber lain ( sambil membaca loop )
sumber
IFS
. (Untuk semua orang,IFS
mari kita tentukan pembatas tertentu, yang memungkinkan spasi putih lainnya untuk dimasukkan dalam string tanpa dipisahkan menjadi substring).$databaseName
hanya berisi seluruh daftar, sehingga hanya satu iterasi.Anda dapat menggunakan sintaks dari
${arrayName[@]}
sumber
Terkejut bahwa belum ada yang memposting ini - jika Anda memerlukan indeks elemen saat Anda mengulang-ulang array, Anda dapat melakukan ini:
Keluaran:
Saya menemukan ini jauh lebih elegan daripada gaya for-loop "tradisional" (
for (( i=0; i<${#arr[@]}; i++ ))
).(
${!arr[@]}
dan$i
tidak perlu dikutip karena itu hanya angka; beberapa akan menyarankan mengutipnya, tapi itu hanya preferensi pribadi.)sumber
Ini juga mudah dibaca:
sumber
IFS=$'\n'
Ini dapat bekerja untuk solusi lain juga dalam skenario ini.Array tersirat untuk skrip atau fungsi:
Selain jawaban yang benar anubhava : Jika sintaks dasar untuk loop adalah:
ada kasus khusus dipesta:
Saat menjalankan skrip atau fungsi, argumen lulus di jalur perintah akan ditugaskan untuk
$@
variabel array, Anda dapat mengakses dengan$1
,$2
,$3
, dan sebagainya.Ini dapat diisi (untuk pengujian) oleh
Satu putaran atas ini array yang dapat ditulis hanya:
Catatan bahwa karya yang dipesan
in
tidak ada dan tidak ada nama array juga!Sampel:
Perhatikan bahwa ini sama dengan
Lalu menjadi naskah :
Simpan ini dalam skrip
myscript.sh
,chmod +x myscript.sh
makaSama dalam suatu fungsi :
Kemudian
sumber
atau hanya
sumber
Cara sederhana:
sumber
Array menyatakan tidak bekerja untuk Korn shell. Gunakan contoh di bawah ini untuk shell Korn:
sumber
for i in ${foo[*]}
pada dasarnya selalu hal yang salah -for i in "${foo[@]}"
adalah bentuk yang mempertahankan batas-batas daftar asli dan mencegah ekspansi global. Dan gaungnya harusecho "$i"
Ini mirip dengan jawaban user2533809, tetapi setiap file akan dieksekusi sebagai perintah terpisah.
sumber
Jika Anda menggunakan Korn shell, ada " set -A databaseName ", kalau tidak ada " mendeklarasikan -a databaseName "
Untuk menulis skrip yang bekerja pada semua shell,
Itu harus bekerja pada semua kerang.
sumber
$ bash --version
GNU bash, versi 4.3.33 (0) -release (amd64-portbld-freebsd10.0)$ set -A databaseName=("db1" "db2" ....) || declare -a databaseName=("db1" "db2" ....)
bash: kesalahan sintaksis dekat token yang tidak terduga `('Coba ini. Ini bekerja dan diuji.
sumber
array=( "hello world" )
, atauarrray=( "*" )
; dalam kasus pertama itu akan mencetakhello
danworld
secara terpisah, dalam yang kedua itu akan mencetak daftar file, bukan*
Baris pertama yang mungkin dari setiap skrip / sesi Bash:
Gunakan misalnya:
Dapat mempertimbangkan:
echo
penafsiran-e
sebagai opsi di sinisumber
Perulangan garis tunggal,
Anda akan mendapatkan output seperti ini,
sumber
Yang benar-benar saya butuhkan untuk ini adalah sesuatu seperti ini:
Contohnya:
(Akan membunuh semua proses dengan vlc dalam nama mereka)
sumber
Saya mengulangi array proyek saya untuk
git pull
pembaruan:sumber