Apa yang dibaca?
Baca adalah perintah bash builtin yang membaca kandungan baris menjadi pemboleh ubah. Ia memungkinkan pemisahan kata yang terikat dengan pemboleh ubah shell khas IFS. Ini terutama digunakan untuk menangkap input pengguna tetapi dapat digunakan untuk melaksanakan fungsi mengambil input dari input standar.
Bash membaca bantuan arahan builtin
Sebelum kita mengetahui bagaimana menggunakan perintah baca dalam skrip bash, berikut adalah cara kita mendapatkan bantuan. Di sana anda harus melihat semua pilihan yang tersedia untuk perintah baca bersama dengan keterangan yang akan kami cuba bahas dalam contoh.
Garis arahan
menolong membaca
Pengeluaran
baca:membaca [-ers] [-pelbagai] [-d berkongsi] [-i teks] [-n nchars] [-N nchars]
[-p segera] [- waktu tamat] [-u fd] [nama ...]
Baca baris dari input standard danberpecahke ladang.
Membaca satu baris dari input standard, atau darifailpenerangan FD
sekiranyayang-upilihan disediakan. Garisan adalahberpecahke ladangsebagaidengan perkataan
membelah, dan perkataan pertama diberikan kepada NAMA pertama, yang kedua
kata untuk NAMA kedua, dan seterusnya, dengan kata-kata yang tinggal
yangterakhirNAMA. Hanya watak yang dijumpaidalam $ IFSdiiktirafsebagaiperkataan
pembatas.
Sekiranya tiada NAMA yang dibekalkan, talianmembacadisimpandalampemboleh ubah REPLY.
Pilihan:
-untuksusunan menetapkan perkataanmembacakepada indeks berurutan bagi array
pemboleh ubah ARRAY, bermula pada sifar
-dpersempadananteruskan sehinggawatak pertama DELIM adalahmembaca, sebaliknya
daripada barisan baru
-kami menggunakan Readline untuk mendapatkan garisdalamshell interaktif
-iteks menggunakan TEKSsebagaiteks awaluntukGaris baca
-nncharskembalisetelah membaca watak NCHARS daripada menunggu
untukbarisan baru, tetapi menghormati pembatassekiranyakurang daripada
Watak NCHARS adalahmembacasebelum pembatas
-Nncharskembalihanya setelah membaca watak NCHARS dengan tepat, kecuali
EOF ditemui ataumembaca kalikeluar, mengabaikan apa-apa
pembatas
-psecepat kilat keluarkan rentetan PROMPT tanpa mengejar baris baru sebelumnya
berusaha untukmembaca
-rbuattidak membenarkan garis miring terbalik melarikan diri dari sebarang watak
-sbuattidakmembuanginput datang dari terminal
-tmasa tamatmasakeluar dankembalikegagalansekiranyakelengkapsebaris
input tidakmembacadalam masa TIMEOUT saat. Nilai bagi
Pemboleh ubah TMOUT adalah tamat masa lalai. TIMEOUT mungkin a
nombor pecahan. Sekiranya TIMEOUT adalah0,membacakembali
dengan segera, tanpa mencubamembacasebarang data, mengembalikan
kejayaan sahajasekiranyainput tersedia pada yang ditentukan
failpenerangan. Thejalan keluarstatus lebih besar daripada128
sekiranyatamat masa tamat
-ufdmembacadarifaildeskriptor FD dan bukannya input standard
Status Keluar:
Thekembalikod adalah sifar, kecuali jika akhir fail ditemui,membaca kalikeluar
(dalam yang mana kesialebih besar daripada 128), kesalahan tugasan berubah
Menangkap input pengguna
Skrip bash interaktif adalah apa-apa tanpa menangkap input pengguna. Baca terbina menyediakan kaedah bahawa input pengguna dapat ditangkap dalam skrip bash.
Menangkap sebilangan input
Untuk menangkap sebilangan NAMA dan pilihan tidak diperlukan dengan membaca. Apabila NAMA tidak ditentukan, pemboleh ubah bernama REPLY digunakan untuk menyimpan input pengguna.
Perintah
{membuang -n 'Taipkan sesuatu dan tekan enter:';
membaca;
membuangAnda menaip$ {JAWAPAN}
}
Pengeluaran
Taipkan sesuatu dan tekan enter: sesuatu(baris baru)Anda menaip sesuatu
Menangkap kata input
Untuk menangkap kata input, pilihan -d diperlukan. Sekiranya ada perkataan, kita akan menetapkan -d ke spasi, baca '-d'. Itulah ketika pengguna menekan spasi yang dibaca akan memuat REPLY dengan perkataan.
Perhatikan bahawa apabila pilihan -d ditetapkan, ruang belakang tidak berfungsi seperti yang diharapkan. Untuk mengundurkan ruang, ketika berusaha menangkap kata input, pilihan -e boleh digunakan, baca -e '-d'.
Perintah
membuang -n 'Taipkan sesuatu dan tekan ruang:';
membaca '-d';
membuang '';
membuang 'Anda menaip$ {JAWAPAN}'
}
Pengeluaran
Taipkan sesuatu dan tekan ruang: sesuatu(ruang)Anda menaip sesuatu
Pengguna yang pantas
Dalam skrip bash interaktif yang meminta pengguna mungkin memerlukan mesej untuk memberitahu pengguna apa input yang diharapkan. Kita selalu dapat melakukannya dengan menggunakan echo builtin. Namun, ternyata ada pilihan menggunakan baca.
Pengguna secepat mungkin
Dalam menangkap kata input, kami menggunakan gema untuk menulis Ketik sesuatu dan tekan ruang: ke output standard sebelum membaca '-d'. Pilihan -p membolehkan mesej dipaparkan sebelum membaca dari input standard.
Perintah
{membaca -p 'Taipkan sesuatu dan tekan ruang:' '-d';
membuang '';
membuang 'Anda menaip$ {JAWAPAN}'
}
Pengeluaran
Taipkan sesuatu dan tekan ruang: sesuatu(ruang)Anda menaip sesuatu
Segera rahsia pengguna
Semasa menangkap input pengguna tanpa muncul di terminal, pilihan -s sangat berguna. read -s -p membolehkan anda menangkap dan menyembunyikan input pengguna seperti berikut.
Perintah
{membaca -s -p 'Ketik sesuatu yang saya berjanji untuk merahsiakannya:'
membuang '';
membuang 'Rahsia anda selamat dengan saya';tidak tenteramJAWAPAN;
membuang '$ {JAWAPAN}'
}
Pengeluaran
Taipkan sesuatu yang saya berjanji untuk merahsiakannya:Rahsia anda selamat dengan saya
Fungsi menggunakan baca
Berikut adalah contoh fungsi dalam bash yang menggunakan input baca dan standard
Konsep teras
Fungsi menggunakan baca menggunakan input dan parameter standard paip. Input utama untuk diproses seperti baris dalam fail dihantar melalui input standard melalui paip. Input lain jika-ada dan pilihan diteruskan sebagai parameter.
membaca -t 1NAMA1 NAMA2 ...membacaialahterbina dalam arahan
-t 1 mengelakkan skrip bash menunggu selama-lamanya untuk baris dikembalikan melalui input standard. Sekiranya input standard pada mulanya kosong, fungsi kembali dengan kod keluar 142 yang menandakan bahawa tidak ada tarikh yang dibaca dalam jangka masa tamat
NAME1 NAME2 adalah nama berubah-ubah... banyak nama pemboleh ubah boleh disenaraikan
Sekarang setelah kerja-kerja dasar disiapkan, mari kita lihat fungsi-fungsi biasa seperti yang dilaksanakan menggunakan baca.
Gabung fungsi menggunakan baca
Katakan kita mahu fungsi bergabung yang mengambil senarai kata dan mengembalikan senarai kata lain yang disatukan oleh pembatas. Inilah cara kami melaksanakan fungsi bergabung menggunakan baca.
Skrip#! / bin / bash
## sertai
## versi 0.0.2 - betulkan parameter rekursi
################################################# #
sertai() { { tempatanhad;penghad='$ {1-}';tempatanpengecualian;
pengecualian='$ {2-}';}
tempatankereta
tempatancdr
tempatanIFS
IFS='$ {indelimiter}'
membaca -t 1kereta cdr|| kembali
ujian '$ {cdr}' || { membuang '$ {kereta}';kembali;}
membuang '$ {kereta}$ {pengecualian}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {pengecualian}'
}
################################################# #
## dihasilkan oleh create-stub2.sh v0.1.2
## pada Isnin, 17 Jun 2019 12:24:59 +0900
## lihat
################################################# #
Sumber: sertai.sh
Garis arahan
Pengeluaran
a.bGaris arahan
membuanga b| sertai | sertai. |Pengeluaran
ke|bFungsi peta menggunakan baca
Katakan kita mahu fungsi peta yang mengambil senarai dan mengembalikan senarai lain yang mengandungi bilangan elemen yang sama yang diubah oleh fungsi lain. Inilah cara kita melaksanakan fungsi peta menggunakan baca.
Skrip#! / bin / bash
## peta
## versi 0.0.1 - awal
################################################# #
peta() { { tempatanfungsi_nama;fungsi_nama='$ {1}';}
tempatankereta
tempatancdr
tempatanIFS
IFS='$ {indelimiter-}'
membaca -t 1kereta cdr|| kembali
ujian '$ (nyatakan -f $ {function_name})' || kembali
ujian '$ {kereta}' || { benar;kembali;}
$ {fungsi_nama} $ {kereta}
membuang '$ {cdr}' | $ {FUNCNAME} '$ {fungsi_nama}'
}
################################################# #
## dihasilkan oleh create-stub2.sh v0.1.2
## pada Sel, 18 Jun 2019 08:33:49 +0900
## lihat
################################################# #
Sumber: peta.sh
Perintah
membuang {1..10} |peta pow
Pengeluaran
14
9
16
25
36
49
64
81
100
Fungsi penapis menggunakan baca
Katakan kita mahu fungsi penapis yang mengambil senarai dan mengembalikan sub senarai elemen yang memenuhi syarat yang ditetapkan oleh fungsi lain. Inilah cara kami melaksanakan fungsi penapis menggunakan baca.
Skrip#! / bin / bash
## penapis
## versi 0.0.1 - awal
################################################# #
tapis() { { tempatanfungsi_nama;fungsi_nama='$ {1}';}
tempatankereta
tempatancdr
tempatanIFS
IFS='$ {indelimiter-}'
membaca -t 1kereta cdr|| kembali
ujian '$ (nyatakan -f $ {function_name})' || kembali
ujian '$ {kereta}' || { benar;kembali;}
$ {fungsi_nama} '$ {kereta}' || membuang -n '$ {kereta}'
membuang '$ {cdr}' | $ {FUNCNAME} '$ {fungsi_nama}'
}
################################################# #
## dihasilkan oleh create-stub2.sh v0.1.2
## pada Sel, 18 Jun 2019 13:19:54 +0900
## lihat
################################################# #
Sumber: tapis.sh
Perintah
ganjil() { tempatan -i i=$ {1};ujian !$((i% 2 )) -eq 1;}membuang {1..10} |penapis ganjil
Pengeluaran
1 3 5 7 9Gelung menggunakan baca
Gelung menggunakan baca membolehkan anda melakukan lelaran melalui baris fail yang akan dihasilkan atau sudah ada.
Gelung asas semasa membaca untuk sebelah kiri (lhs)
Kami mempunyai perintah atau fungsi (lhs) yang dapat menghasilkan baris dalam fail yang dapat dilancarkan menggunakan loop baca dan sementara.
Bentukkanlhs| sementara membaca
buat
benar
selesai
lhs adalah aarahanyang mengembalikan senarai baris
Perintah
seq 5 | sementara membacaibuat
membuang $ {i}
selesai
Pengeluaran
12
3
4
5
Gelung asas semasa membaca untuk sebelah kanan (rhs)
Kami mempunyai fail (rhs) dengan garisan yang dapat dilingkari menggunakan gelung baca dan sebentar.
Bentukkansementara membaca
buat
benar
selesai <rhs
rhs adalah afailmengandungi garis
Perintah
seq 5 >rhssementara membacai
buat
membuang $ {i}
selesai <rhs
Pengeluaran
1
2
3
4
5
Custom lhs semasa loop menggunakan baca
Kami mempunyai aliran kata-kata yang ingin kami lalui menggunakan membaca.
Bentukkan(
IFS=''
lhs| sementara membaca
buat
benar
selesai
)
lhs adalah senarai perkataan
Perintah
(IFS=''
membuang {1..5} | sementara membacai
buat
membuang '$ {i}
selesai
)
Pengeluaran
1 2 3 4 5Membaca dari mana-mana fd dan bukannya input standard
Pilihan baca terbina yang sering tidak disentuh adalah pilihan yang membolehkan anda menentukan deskriptor fail apa yang hendak dibaca, baca -u FD. Secara lalai FD dianggap sebagai input standard.
Konsep teras
Apabila fail dibuka deskriptor fail ditetapkan. Pengalihan IO dalam bash membolehkan fail dibiarkan terbuka dengan deskriptor fail tertentu. Kami dibenarkan menulis ke fail, membacanya, dan menutupnya setelah selesai.
_(){
kucing /penipu/batal>myfifo;# kosongkan myfifo
exec 3<myfifo;# buka fail myfifo sebagai fd 3
membuang 'Hai dunia! - dari fd 3 ' >myfifo;# tulis kepada myfifo
membaca -u 3;# baris baca dari fd 3
exec 3> &-;# tutup fd 3
membuang $ {JAWAPAN} # baris output dibaca dari fd 3 sebelum ditutup
}
_# Hai dunia! dari fd 3
Membina kereta api dengan penerangan fail dan membaca -u FD
Hanya untuk bersenang-senang, saya memutuskan untuk membina kereta api dengan penerangan fail dan membaca -u FD. Untuk setiap deskriptor fail ditulis nombor. Setiap deskriptor fail dibaca dari deskriptor fail 1 di bawah dan dilampirkan sendiri.
Garis arahan
bashlinuxhint.com/membina/kereta api test-read-fd.sh10Pengeluaran
memulakan fds ...memulakan fd3...
fd3meminati
memulakan fd4...
fd4meminati
fds diperintahkan
membaca dari fd3dan4...
4 3
fds sebelum membersihkan
0 1 2 3 4 5
membersihkan ...
membersihkan fds ...
selesaimembersihkan fds
fds selepas membersihkan
0 1 2 3
Langkau fungsi menggunakan read -u FD
Sekiranya anda berlari
tidak dikenali -untukMINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0.307/5/3)
2017-02-17 14:dua puluhx86_64 Msys
bash - penukaran
GNUbash, versi 4.4.12(1)-melepaskan(x86_64-pc-msys)
mungkin disebabkan oleh bug untuk melaksanakan fungsi skip yang melangkau baris berikut dalam skrip bash di luar fungsi sebelum sumber skrip dibaca. Perhatikan bahawa ia tidak berfungsi pada kebanyakan sistem. Sebagai contoh,
tidak dikenali -untukLinux 4.9.0-8-amd64# 1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU / Linux
bash - penukaran
GNUbash, versi 4.4.12(1)-melepaskan(x86_64-pc-linux-gnu)
langkau tidak terbang.
Fungsi
ponteng() { membaca -u 31;}
Perintah
pontengmembuanggarisan dilangkau
benar
Pengeluaran
(kosong)Pokoknya
Bacaan built-in bash lebih daripada menangkap input pengguna. Ini dapat digunakan dalam fungsi, loop dan pertukaran antara deskriptor file yang digunakan dalam skrip bash. Kadang kala penerokaan menggunakan deskriptor baca dan fail dapat menghasilkan telur Paskah.