Arahan baca Bash

Bash Read Command



Baca atau mati kawan. Perintah baca sama pentingnya dengan parameter kedudukan dan perintah echo. Bagaimana lagi anda dapat menangkap input pengguna, menerima kata laluan, fungsi menulis, gelung, dan mengintip deskriptor fail? Teruskan membaca.

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

membuanga b| sertai

Pengeluaran

a.b

Garis arahan

membuanga b| sertai | sertai. |

Pengeluaran

ke|b

Fungsi 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

NS() { tempatan -i i=$ {1};membuang$((i** 2 ));}
membuang {1..10} |peta pow

Pengeluaran

1
4
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 9

Gelung 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.

Bentukkan

lhs| sementara membaca
buat
benar
selesai
lhs adalah aarahanyang mengembalikan senarai baris

Perintah

seq 5 | sementara membacai
buat
membuang $ {i}
selesai

Pengeluaran

1
2
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.

Bentukkan

sementara membaca
buat
benar
selesai <rhs

rhs adalah afailmengandungi garis

Perintah

seq 5 >rhs
sementara 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 5

Membaca 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.sh10

Pengeluaran

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 -untuk
MINGW64_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 -untuk
Linux 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

ponteng
membuanggarisan 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.