Apa yang dibaca?
Read adalah perintah bash builtin yang membaca isi baris ke dalam variabel. Ini memungkinkan pemisahan kata yang terkait dengan variabel shell khusus IFS. Ini terutama digunakan untuk menangkap input pengguna tetapi dapat digunakan untuk mengimplementasikan fungsi yang mengambil input dari input standar.
Bash baca bantuan perintah bawaan
Sebelum kita menyelami cara menggunakan perintah read dalam skrip bash, berikut adalah cara kami mendapatkan bantuan. Di sana Anda akan melihat semua opsi yang tersedia untuk perintah baca bersama dengan deskripsi yang akan kami coba bahas dalam contoh.
Garis komando
Tolong Baca
Keluaran
Baca:Baca [-ers] [-sebuah array] [-d berbagi] [-aku teks] [-n nchars] [-N nchars]
[-p cepat] [-t waktu habis] [-u fd] [nama ...]
Baca baris dari input standar danmembelahitu ke dalam bidang.
Membaca satu baris dari input standar, atau darimengajukandeskripsi FD
jikaNS-uopsi disediakan. Garisnya adalahmembelahke dalam bidangsebagaidengan kata
membelah, dan kata pertama ditetapkan untuk NAMA pertama, yang kedua
kata ke NAMA kedua, dan seterusnya, dengan kata-kata sisa yang ditetapkan untuk
NSterakhirNAMA. Hanya karakter yang ditemukandi dalam $IFSdiakuisebagaikata
pembatas.
Jika tidak ada NAMA yang diberikan, jalurBacatersimpandi dalamvariabel REPLY.
Pilihan:
-kearray menetapkan kata-kataBacake indeks berurutan dari array
variabel ARRAY, mulai dari nol
-Dpembatasmelanjutkan sampaikarakter pertama DELIM adalahBaca, lebih tepatnya
dari baris baru
-e gunakan Readline untuk mendapatkan garisdi dalamcangkang interaktif
-Sayateks menggunakan TEKSsebagaiteks awaluntukGaris baca
-nncharskembalisetelah membaca karakter NCHARS daripada menunggu
untukbaris baru, tetapi hormati pembatasjikalebih sedikit dari
Karakter NCHARS adalahBacasebelum pembatas
-Nncharskembalihanya setelah membaca karakter NCHARS dengan tepat, kecuali
EOF ditemui atauBaca waktukeluar, mengabaikan apapun
pembatas
-Pprompt output string PROMPT tanpa baris baru sebelumnya
mencoba untukBaca
-Rmelakukantidak mengizinkan garis miring terbalik untuk keluar dari karakter apa pun
-Smelakukanbukandibuangmasukan yang berasal dari terminal
-Twaktu habiswaktukeluar dankembalikegagalanjikakemenyelesaikangaris
masukan tidakBacadalam TIMEOUT detik. Nilai dari
Variabel TMOUT adalah batas waktu default. TIMEOUT mungkin
bilangan pecahan. Jika TIMEOUT adalah0,Bacakembali
segera, tanpa berusahaBacadata apa pun, kembali
sukses sajajikainput tersedia pada yang ditentukan
mengajukandeskriptor. NSkeluarstatusnya lebih besar dari128
jikabatas waktu terlampaui
-ufdBacadarimengajukandeskriptor FD alih-alih input standar
Status Keluar:
NSkembalikode adalah nol, kecuali end-of-file ditemukan,Baca waktukeluar
(di dalam yang kasusdialebih besar dari 128), penugasan variabel err
Menangkap masukan pengguna
Skrip bash interaktif tidak ada artinya tanpa menangkap input pengguna. Read builtin menyediakan metode yang input pengguna dapat ditangkap dalam skrip bash.
Menangkap garis input
Untuk menangkap sebaris NAMA input dan opsi tidak diperlukan dengan membaca. Ketika NAME tidak ditentukan, variabel bernama REPLY digunakan untuk menyimpan input pengguna.
Perintah
{dibuang -n 'Ketik sesuatu dan tekan enter:';
Baca;
dibuangAnda mengetik${JAWAB}
}
Keluaran
Ketik sesuatu dan tekan enter: sesuatu(garis baru)Anda mengetik sesuatu
Menangkap kata masukan
Untuk menangkap kata input, opsi -d diperlukan. Dalam kasus kata kita akan mengatur -d ke spasi, baca '-d'. Yaitu ketika pengguna menekan spasi read akan memuat REPLY dengan kata.
Perhatikan bahwa ketika opsi -d disetel, backspace tidak berfungsi seperti yang diharapkan. Untuk mundur, saat mencoba menangkap kata input, opsi -e dapat digunakan, baca -e '-d'.
Perintah
dibuang -n 'Ketik sesuatu dan tekan spasi:';
Baca '-D ';
dibuang '';
dibuang 'Anda mengetik${JAWAB}'
}
Keluaran
Ketik sesuatu dan tekan spasi: sesuatu(ruang angkasa)Anda mengetik sesuatu
Pengguna cepat
Dalam skrip bash interaktif yang meminta pengguna mungkin memerlukan pesan untuk memberi tahu pengguna input apa yang diharapkan. Kami selalu dapat mencapai ini menggunakan echo builtin. Namun, ternyata ada opsi menggunakan read.
Prompt pengguna untuk sebuah kata
Dalam menangkap kata input, kami menggunakan echo untuk menulis Ketik sesuatu dan tekan spasi: ke output standar sebelum membaca '-d'. Opsi -p memungkinkan pesan ditampilkan sebelum membaca dari input standar.
Perintah
{Baca -P 'Ketik sesuatu dan tekan spasi:' '-D ';
dibuang '';
dibuang 'Anda mengetik${JAWAB}'
}
Keluaran
Ketik sesuatu dan tekan spasi: sesuatu(ruang angkasa)Anda mengetik sesuatu
Meminta pengguna untuk sebuah rahasia
Saat menangkap input pengguna tanpa muncul di terminal, opsi -s berguna. read -s -p memungkinkan Anda untuk menangkap dan menyembunyikan input pengguna sebagai berikut.
Perintah
{Baca -S -P 'Ketik sesuatu yang saya janjikan untuk dirahasiakan:'
dibuang '';
dibuang 'Rahasiamu aman denganku';tidak disetelMEMBALAS ;
dibuang '${JAWAB}'
}
Keluaran
Ketik sesuatu yang saya berjanji untuk merahasiakannya:Rahasiamu aman denganku
Fungsi menggunakan read
Berikut adalah contoh fungsi di bash yang menggunakan input baca dan standar
Konsep inti
Fungsi yang menggunakan read memanfaatkan input dan parameter standar yang disalurkan. Input utama yang akan diproses seperti baris dalam file dilewatkan melalui input standar melalui pipa. Masukan lain jika-ada dan opsi dilewatkan sebagai parameter.
Baca -T 1NAMA1 NAMA2 ...Bacaadalahbawaan memerintah
-t 1 mencegah skrip bash menunggu tanpa batas waktu agar baris dikembalikan melalui input standar. Jika input standar awalnya kosong, fungsi kembali dengan kode keluar 142 yang menandakan bahwa tidak ada tanggal yang dibaca dalam periode waktu habis yang ditetapkan
NAME1 NAME2 adalah nama variabel... banyak nama variabel dapat dicantumkan
Sekarang setelah dasar-dasarnya ditetapkan, mari kita lihat seperti apa fungsi yang sudah dikenal diimplementasikan menggunakan read.
Gabung fungsi menggunakan baca
Misalkan kita menginginkan fungsi join yang mengambil daftar kata dan mengembalikan daftar kata lain yang digabungkan dengan pembatas. Berikut adalah bagaimana kita dapat mengimplementasikan fungsi join menggunakan read.
Naskah#!/bin/bash
## Ikuti
## versi 0.0.2 - memperbaiki parameter rekursi
#############################################################
Ikuti() { { lokalpembatas;pembatas='$ {1-}';lokalpembatas;
pembatas luar='$ {2-.}';}
lokalmobil
lokalcdr
lokalIFS
IFS='${batas tak terbatas}'
Baca -T 1cdr mobil|| kembali
tes '${cdr}' || { dibuang '${mobil}';kembali;}
dibuang '${mobil}${batas luar}${cdr}' | ${FUNCNAME} '${batas tak terbatas}'
'${batas luar}'
}
#############################################################
## dihasilkan oleh create-stub2.sh v0.1.2
## pada Sen, 17 Jun 2019 12:24:59 +0900
## Lihat
#############################################################
Sumber: join.sh
Garis komando
Keluaran
a.bGaris komando
dibuanga b| Ikuti | Ikuti. |Keluaran
ke|BFungsi peta menggunakan baca
Misalkan kita menginginkan fungsi peta yang mengambil daftar dan mengembalikan daftar lain yang berisi jumlah elemen yang sama yang dimodifikasi oleh fungsi lain. Berikut adalah bagaimana kita dapat mengimplementasikan fungsi peta menggunakan read.
Naskah#!/bin/bash
## peta
## versi 0.0.1 - inisial
#############################################################
peta() { { lokalnama_fungsi;nama_fungsi='$ {1}';}
lokalmobil
lokalcdr
lokalIFS
IFS='${batas tak terbatas- }'
Baca -T 1cdr mobil|| kembali
tes '$( mendeklarasikan -f ${function_name} )' || kembali
tes '${mobil}' || { benar;kembali;}
${nama_fungsi} ${mobil}
dibuang '${cdr}' | ${FUNCNAME} '${nama_fungsi}'
}
#############################################################
## dihasilkan oleh create-stub2.sh v0.1.2
## pada Sel, 18 Jun 2019 08:33:49 +0900
## Lihat
#############################################################
Sumber: peta.sh
Perintah
dibuang {1..10} |peta po
Keluaran
14
9
16
25
36
49
64
81
100
Fungsi filter menggunakan read
Misalkan kita menginginkan fungsi filter yang mengambil daftar dan mengembalikan subdaftar elemen yang memenuhi kondisi yang ditetapkan oleh fungsi lain. Berikut adalah bagaimana kita dapat mengimplementasikan fungsi filter menggunakan read.
Naskah#!/bin/bash
## Saring
## versi 0.0.1 - inisial
#############################################################
Saring() { { lokalnama_fungsi;nama_fungsi='$ {1}';}
lokalmobil
lokalcdr
lokalIFS
IFS='${batas tak terbatas- }'
Baca -T 1cdr mobil|| kembali
tes '$( mendeklarasikan -f ${function_name} )' || kembali
tes '${mobil}' || { benar;kembali;}
${nama_fungsi} '${mobil}' || dibuang -n '${mobil}'
dibuang '${cdr}' | ${FUNCNAME} '${nama_fungsi}'
}
#############################################################
## dihasilkan oleh create-stub2.sh v0.1.2
## pada Sel, 18 Jun 2019 13:19:54 +0900
## Lihat
#############################################################
Sumber: filter.sh
Perintah
aneh() { lokal -Saya Saya=$ {1};tes !$((Saya% 2 )) -persamaan 1;}dibuang {1..10} |filter aneh
Keluaran
1 3 5 7 9Loop menggunakan read
Loop menggunakan read memungkinkan Anda untuk beralih melalui baris file yang akan dibuat atau sudah ada.
Dasar while read loop untuk sisi kiri (lhs)
Kami memiliki perintah atau fungsi (lhs) yang dapat menghasilkan baris dalam file yang dapat diulang menggunakan read dan while loop.
Membangunlhs| ketika Baca
melakukan
benar
selesai
lhs adalahmemerintahyang mengembalikan daftar baris
Perintah
seq 5 | ketika BacaSayamelakukan
dibuang ${i}
selesai
Keluaran
12
3
4
5
Dasar while read loop untuk ruas kanan (rhs)
Kami memiliki file (rhs) dengan garis yang dapat diulang menggunakan read dan while loop.
Membangunketika Baca
melakukan
benar
selesai <rhs
rhs adalahmengajukanmengandung garis
Perintah
seq 5 >rhsketika BacaSaya
melakukan
dibuang ${i}
selesai <rhs
Keluaran
1
2
3
4
5
Kustom lhs while loop menggunakan read
Kami memiliki aliran kata yang ingin kami ulangi menggunakan read.
Membangun(
IFS=''
lhs| ketika Baca
melakukan
benar
selesai
)
lhs adalah daftar kata
Perintah
(IFS=''
dibuang {1..5} | ketika BacaSaya
melakukan
dibuang '${i}
selesai
)
Keluaran
1 2 3 4 5Membaca dari fd apa pun alih-alih input standar
Opsi baca bawaan yang sering dibiarkan tidak tersentuh adalah opsi yang memungkinkan Anda menentukan deskriptor file apa yang akan dibaca, baca -u FD. Secara default FD diambil sebagai input standar.
Konsep inti
Ketika file dibuka, deskriptor file ditetapkan. Pengalihan IO di bash memungkinkan file dibiarkan terbuka dengan deskriptor file tertentu. Kami diizinkan untuk menulis ke file, membaca darinya, dan menutupnya ketika kami selesai.
_(){
kucing /dev/batal>myfifo;#myfifo kosong
eksekutif 3<myfifo;# buka file myfifo sebagai fd 3
dibuang 'Halo Dunia! - dari fd 3' >myfifo;# tulis ke myfifo
Baca -u 3;# baca baris dari fd 3
eksekutif 3> &-;# tutup fd 3
dibuang ${JAWAB} # jalur keluaran dibaca dari fd 3 sebelum ditutup
}
_# Halo Dunia! dari fd 3
Membangun kereta dengan deskriptor file dan membaca -u FD
Hanya untuk bersenang-senang, saya memutuskan untuk membuat kereta dengan deskriptor file dan membaca -u FD. Untuk setiap deskriptor file nomor ditulis. Setiap deskriptor file membaca dari deskriptor file 1 di bawah dan menambahkan ke dirinya sendiri.
Garis komando
pestalinuxhint.com/membangun/tes-baca-fd.sh kereta10Keluaran
inisialisasi fds ...inisialisasi fd3...
fd3diinisialisasi
inisialisasi fd4...
fd4diinisialisasi
fds diinisialisasi
membaca dari fd3dan4...
4 3
fds sebelum membersihkan
0 1 2 3 4 5
membersihkan ...
membersihkan fds ...
selesaimembersihkan fds
fds setelah dibersihkan
0 1 2 3
Lewati fungsi menggunakan read -u FD
Jika Anda sedang berlari
nama kamu -keMINW64_NT-10.0DESKTOP-XVVVVVVV 2.7.0(0.307/5/3)
2017.-02-17 14:dua puluhx86_64 Sistem
pesta --Versi: kapan
GNUpesta, versi 4.4.12(1)-melepaskan(x86_64-pc-msys)
mungkin karena bug untuk mengimplementasikan fungsi lewati yang melewati baris berikut dalam skrip bash di luar fungsi sebelum sumber skrip dibaca. Perhatikan bahwa ini tidak berfungsi pada sebagian besar sistem. Sebagai contoh,
nama kamu -keLinux 4.9.0-8-amd64#1 SMP Debian 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
pesta --Versi: kapan
GNUpesta, versi 4.4.12(1)-melepaskan(x86_64-pc-linux-gnu)
lewati tidak terbang.
Fungsi
melewati() { Baca -u 31;}
Perintah
melewatidibuanggaris dilewati
benar
Keluaran
(kosong)Intinya
Baca builtin di bash tidak lebih dari menangkap input pengguna. Ini dapat digunakan dalam fungsi, loop, dan pertukaran antara deskriptor file yang digunakan dalam skrip bash. Kadang-kadang eksplorasi menggunakan deskriptor baca dan file dapat menghasilkan telur Paskah.