Perintah baca bash

Bash Read Command



Baca atau mati teman. Perintah read sama pentingnya dengan parameter posisi dan perintah echo. Bagaimana lagi Anda akan menangkap input pengguna, menerima kata sandi, menulis fungsi, mengulang, dan mengintip ke deskriptor file? Baca terus.

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

dibuanga b| Ikuti

Keluaran

a.b

Garis komando

dibuanga b| Ikuti | Ikuti. |

Keluaran

ke|B

Fungsi 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

NS() { lokal -Saya Saya=$ {1};dibuang$((Saya** 2 ));}
dibuang {1..10} |peta po

Keluaran

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

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

Membangun

lhs| ketika Baca
melakukan
benar
selesai
lhs adalahmemerintahyang mengembalikan daftar baris

Perintah

seq 5 | ketika BacaSaya
melakukan
dibuang ${i}
selesai

Keluaran

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

Membangun

ketika Baca
melakukan
benar
selesai <rhs

rhs adalahmengajukanmengandung garis

Perintah

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

Membaca 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 kereta10

Keluaran

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 -ke
MINW64_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 -ke
Linux 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

melewati
dibuanggaris 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.