Bash okuma komutu

Bash Read Command



Okuyun ya da ölün arkadaşlar. Okuma komutu, konumsal parametreler ve yankı komutu kadar önemlidir. Kullanıcı girdisini başka nasıl yakalayacak, parolaları kabul edecek, işlevler yazacak, döngüye girecek ve dosya tanımlayıcılarına nasıl göz atacaksınız? Okumaya devam etmek.

Ne okunur?

Read, bir satırın içeriğini bir değişkene okuyan bir bash yerleşik komutudur. Özel kabuk değişkeni IFS'ye bağlı sözcük bölmeye izin verir. Öncelikle kullanıcı girdisini yakalamak için kullanılır, ancak standart girdiden girdi alan işlevleri uygulamak için kullanılabilir.







Bash yerleşik komut yardımını oku

Bash betiklerinde read komutunun nasıl kullanılacağına dalmadan önce, nasıl yardım alacağımız aşağıda açıklanmıştır. Burada, örneklerde ele almaya çalışacağımız açıklamalarla birlikte read komutu için mevcut tüm seçenekleri görmelisiniz.



Komut satırı



Yardım okuman

Çıktı





okuman:okuman [-ers] [-bir dizi] [-d payı] [-i metin] [-n nchars] [-N karakter]
[-p istemi] [-t zaman aşımı] [-u fd] [isim ...]

Standart girişten bir satır okuyun vebölmekalanlara girer.

Standart girdiden tek bir satır okur veyadosyatanımlayıcı FD
EğerNS-useçeneği sunulur. çizgibölmekalanlaraolarakkelime ile
bölünür ve ilk kelime ilk İSİM'e atanır, ikincisi
ikinci AD'ye sözcük, vb.
NSgeçenİSİM. Sadece bulunan karakterleriçinde $IFStanınmışolarakkelime
sınırlayıcılar.

Hiçbir NAME sağlanmazsa, satırokumansaklanıriçindeREPLY değişkeni.

Seçenekler:
-iledizi kelimeleri ataokumandizinin sıralı indekslerine
değişken ARRAY, sıfırdan başlayarak
-NSsınırlamakdevam et a kadarDELIM'in ilk karakteriokuman, yerine
yeni satırdan daha
-e satırı elde etmek için Readline'ı kullanıniçindeetkileşimli bir kabuk
-benmetin kullanımı METİNolarakilk metiniçinOkuma satırı
-nncharsdönüşbeklemek yerine NCHARS karakterlerini okuduktan sonra
içinyeni satır, ancak sınırlayıcıyı onurlandırEğerDaha az

NCHARS karakterleriokumansınırlayıcıdan önce
-Nncharsdönüşyalnızca tam olarak NCHARS karakterlerini okuduktan sonra,
EOF ile karşılaşıldı veyaokuman zamanlarhiçbirini görmezden gelerek
sınırlayıcı
-Pistemi önce sondaki yeni satır olmadan PROMPT dizesini çıktılayın
teşebbüs etmekokuman
-ryapmakters eğik çizgilerin herhangi bir karakterden kaçmasına izin verme
-syapmakOlumsuzdışarı attıbir terminalden gelen giriş
-Tzaman aşımızamandışarı vedönüşarızaEğeriletamamlayınızhattı
giriş değilokumanTIMEOUT saniye içinde. değeri
TMOUT değişkeni varsayılan zaman aşımıdır. ZAMAN AŞIMI bir olabilir
kesirli sayı. ZAMAN AŞIMI ise0,okumanİadeler
hemen, denemedenokumanherhangi bir veri, dönen
sadece başarıEğergiriş belirtilen üzerinde kullanılabilir
dosyatanımlayıcı. NSçıkışdurum daha büyük128
Eğerzaman aşımı aşıldı
-ufdokumanitibarendosyastandart giriş yerine tanımlayıcı FD

Çıkış Durumu:
NSdönüşdosya sonu ile karşılaşılmadığı sürece kod sıfırdır,okuman zamanlardışarı
(içinde Hangi durumo128'den büyük), bir değişken atama hatası

Kullanıcı girdisini yakalamak

Etkileşimli bash komut dosyaları, kullanıcı girdisini yakalamadan hiçbir şey değildir. Read yerleşik, kullanıcı girdisinin bir bash betiği içinde yakalanabileceği yöntemler sağlar.

Bir girdi satırı yakalamak

Bir satır girişi yakalamak için NAME'ler ve seçenekler okuma tarafından gerekli değildir. NAME belirtilmediğinde, kullanıcı girdisini depolamak için REPLY adlı bir değişken kullanılır.



Komutlar

{
dışarı attı -n 'Bir şey yazın ve enter'a basın:';
okuman;
dışarı attısen yazdın${CEVAP}
}

Çıktı

Bir şey yazın ve enter tuşuna basın: bir şey(Yeni hat)
bir şey yazdın

Bir kelime girdisini yakalamak

Bir girdi sözcüğünü yakalamak için -d seçeneği gereklidir. Bir kelime olması durumunda -d'yi bir boşlukla ayarlardık, '-d' okurduk. Yani kullanıcı boşluk çubuğuna bastığında okunan kelime ile REPLY yükleyecektir.

-d seçeneği ayarlandığında, geri almanın beklendiği gibi çalışmadığını unutmayın. Geri almak için, bir girdi sözcüğünü yakalamaya çalışırken, -e seçeneği kullanılabilir, -e '-d' okunabilir.

Komutlar

{
dışarı attı -n 'Bir şey yazın ve boşluğa basın:';
okuman '-NS ';
dışarı attı '';
dışarı attı 'yazdın${CEVAP}'
}

Çıktı

Bir şey yazın ve boşluğa basın: bir şey(Uzay)
bir şey yazdın

Kullanıcıya sor

Etkileşimli bash komut dosyalarında, bir kullanıcıyı isteyen, kullanıcıya hangi girdinin beklendiğini söyleyen bir mesaj gerektirebilir. Bunu her zaman echo yerleşik kullanarak başarabiliriz. Ancak, okuma kullanarak bir seçenek olduğu ortaya çıktı.

Kullanıcıya bir kelime sor

Bir girdi kelimesini yakalarken, '-d ' okumadan önce standart çıktıya bir şeyler yazmak ve boşluk: basmak için echo kullandık. -p seçeneği, standart girdiden okumadan önce bir mesajın görüntülenmesini sağlar.

Komutlar

{
okuman -P 'Bir şey yazın ve boşluğa basın:' '-NS ';
dışarı attı '';
dışarı attı 'yazdın${CEVAP}'
}

Çıktı

Bir şey yazın ve boşluğa basın: bir şey(Uzay)
bir şey yazdın

Kullanıcıdan bir sır iste

Kullanıcı girişini terminalde görünmeden yakalarken, -s seçeneği kullanışlı olur. read -s -p, kullanıcı girdisini aşağıdaki gibi yakalamanıza ve gizlemenize olanak tanır.

Komutlar

{
okuman -s -P 'Sır olarak tutacağıma söz verdiğim bir şey yaz:'
dışarı attı '';
dışarı attı 'Sırrın benimle güvende';ayarsızCEVAP VERMEK ;
dışarı attı '${CEVAP}'
}

Çıktı

Gizli tutacağıma söz verdiğim bir şey yazın:
Sırrın benimle güvende

Okumayı kullanan işlevler

İşte okuma ve standart girdi kullanan bash içindeki işlev örnekleri

Çekirdek konsept

Okumayı kullanan işlevler, borulu standart girdi ve parametreleri kullanır. Bir dosyadaki satırlar gibi işlenecek ana girdi, bir boru aracılığıyla standart girdiden geçirilir. Diğer girdi varsa ve seçenek parametre olarak iletilir.

okuman -T 1NAME1 NAME2 ...

okumanbiryerleşik emretmek

-t 1 bash betiğinin standart girdi yoluyla bir satırın döndürülmesi için süresiz olarak beklemesini engeller. Standart giriş başlangıçta boşsa, işlev, ayarlanan zaman aşımı süresi içinde hiçbir tarihin okunmadığını belirten 142 çıkış koduyla döner.

NAME1 NAME2 değişken isimleridir

... birçok değişken adı listelenebilir

Artık temeller hazır olduğuna göre, okuma kullanılarak uygulanan tanıdık işlevlerin nasıl göründüğünü görelim.

Okumayı kullanarak birleştirme işlevi

Bir sözcük listesi alan ve bir sınırlayıcıyla birleştirilen başka bir sözcük listesi döndüren bir birleştirme işlevi istediğimizi varsayalım. Read kullanarak bir birleştirme işlevini şu şekilde uygulayabiliriz.

Senaryo

#!/bin/bash
## katılmak
## sürüm 0.0.2 - özyineleme parametrelerini düzeltin
#################################################
katılmak() { { yerelsınırlayıcı;sınırlayıcı='$ {1-}';yerelsınırlayıcı;
sınırlayıcı='$ {2-.}';}
yerelaraba
yerelcdr
yerelIFS
IFS='${sınırlayıcı}'
okuman -T 1araba cdr'si|| dönüş
Ölçek '${cdr}' || { dışarı attı '${araba}';dönüş;}
dışarı attı '${araba}${outsınırlayıcı}${cdr}' | ${FUNCNAME} '${sınırlayıcı}'
'${outsınırlayıcı}'
}
#################################################
## create-stub2.sh v0.1.2 tarafından oluşturuldu
## 17 Haz 2019 Pzt 12:24:59 +0900 tarihinde eklendi
## görmek
#################################################

Kaynak: katıl.sh
Komut satırı

dışarı attıbir b| katılmak

Çıktı

a.b

Komut satırı

dışarı attıbir b| katılmak | katılmak. |

Çıktı

ile|B

Okumayı kullanarak harita işlevleri

Bir liste alan ve başka bir işlev tarafından değiştirilen aynı sayıda öğeyi içeren başka bir liste döndüren bir harita işlevi istediğimizi varsayalım. Okumayı kullanarak bir harita işlevini nasıl uygulayabileceğimiz aşağıda açıklanmıştır.

Senaryo

#!/bin/bash
## harita
## sürüm 0.0.1 - başlangıç
#################################################
harita() { { yerelfonksiyon adı ;fonksiyon adı='$ {1}';}
yerelaraba
yerelcdr
yerelIFS
IFS='${sınırlayıcı- }'
okuman -T 1araba cdr'si|| dönüş
Ölçek '$( bildir -f ${function_name} )' || dönüş
Ölçek '${araba}' || { NS;dönüş;}
${işlev_adı} ${araba}
dışarı attı '${cdr}' | ${FUNCNAME} '${işlev_adı}'
}
#################################################
## create-stub2.sh v0.1.2 tarafından oluşturuldu
## 18 Haziran 2019 Salı 08:33:49 +0900 tarihinde eklendi
## görmek
#################################################

Kaynak: map.sh
Komutlar

NS() { yerel -ben ben=$ {1};dışarı attı$((ben** 2 ));}
dışarı attı {1..10} |harita gücü

Çıktı

1
4
9
16
25
36
49
64
81
100

Okumayı kullanarak filtre işlevi

Bir liste alan ve başka bir işlev tarafından belirlenen koşulları karşılayan öğelerin bir alt listesini döndüren bir filtre işlevi istediğimizi varsayalım. Oku kullanarak bir filtre işlevini nasıl uygulayabileceğimiz aşağıda açıklanmıştır.

Senaryo

#!/bin/bash
## filtre
## sürüm 0.0.1 - başlangıç
#################################################
filtre() { { yerelfonksiyon adı ;fonksiyon adı='$ {1}';}
yerelaraba
yerelcdr
yerelIFS
IFS='${sınırlayıcı- }'
okuman -T 1araba cdr'si|| dönüş
Ölçek '$( bildir -f ${function_name} )' || dönüş
Ölçek '${araba}' || { NS;dönüş;}
${işlev_adı} '${araba}' || dışarı attı -n '${araba}'
dışarı attı '${cdr}' | ${FUNCNAME} '${işlev_adı}'
}
#################################################
## create-stub2.sh v0.1.2 tarafından oluşturuldu
## 18 Haziran 2019 Salı 13:19:54 +0900 tarihinde eklendi
## görmek
#################################################

Kaynak: filtre.sh

Komutlar

garip() { yerel -ben ben=$ {1};Ölçek !$((ben% 2 )) -eq 1;}
dışarı attı {1..10} |tek filtre

Çıktı

1 3 5 7 9

Okumayı kullanan döngüler

Read kullanan döngüler, oluşturulacak veya zaten var olan bir dosyanın satırlarını yinelemenize izin verir.

Sol taraf için temel while okuma döngüsü (lhs)

Bir dosyada read ve while döngüsü kullanılarak döngülenebilen satırlar oluşturabilen bir komuta veya işleve (lhs) sahibiz.

inşa

lhs| süre okuman
yapmak
NS
tamamlamak
lhs biremretmekbu bir satır listesi döndürür

Komutlar

sıra 5 | süre okumanben
yapmak
dışarı attı ${i}
tamamlamak

Çıktı

1
2
3
4
5

Sağ taraf için temel while okuma döngüsü (rhs)

Read ve while döngüsü kullanılarak döngülenebilen satırları olan bir dosyamız (rhs) var.

inşa

süre okuman
yapmak
NS
tamamlamak <rh

rhs birdosyaiçeren çizgiler

Komutlar

sıra 5 >rh
süre okumanben
yapmak
dışarı attı ${i}
tamamlamak <rh

Çıktı

1
2
3
4
5

Okumayı kullanarak döngü sırasında özel lhs

Okumayı kullanarak döngüye sokmak istediğimiz bir kelime akışımız var.

inşa

(
IFS=''
lhs| süre okuman
yapmak
NS
tamamlamak
)

lhs kelimelerin bir listesidir

Komutlar

(
IFS=''
dışarı attı {1..5} | süre okumanben
yapmak
dışarı attı '${i}
tamamlamak
)

Çıktı

1 2 3 4 5

Standart giriş yerine herhangi bir fd'den okuma

Genellikle dokunulmadan bırakılan okuma yerleşik seçeneği, hangi dosya tanıtıcısının okunacağını, read -u FD'yi belirlemenize izin veren seçenektir. Varsayılan olarak FD standart giriş olarak alınır.

Çekirdek konsept

Bir dosya açıldığında dosya tanımlayıcıları atanır. Bash'deki IO yeniden yönlendirmesi, bir dosyanın belirli bir dosya tanımlayıcıyla açık bırakılmasına izin verir. Dosyaya yazmamıza, okumamıza ve işimiz bittiğinde kapatmamıza izin verilir.

_()
{
kedi /dev/boş>myfifo;# boş myfifo
yürütmek 3<myfifo;# myfifo dosyasını fd 3 olarak aç
dışarı attı 'Selam Dünya! - fd 3'den >myfifo;#myfifo'ya yaz
okuman -u 3;# fd 3'ten satır oku
yürütmek 3> &-;# fd 3'ü kapat
dışarı attı ${CEVAP} # çıkış satırı kapanmadan önce fd 3'ten okundu
}
_# Selam Dünya! fd 3'ten

Dosya tanımlayıcıları ve okuma -u FD ile bir tren oluşturma

Sadece eğlence olsun diye, dosya tanımlayıcıları olan bir tren yapmaya ve -u FD okumaya karar verdim. Her dosya tanıtıcısına bir numara yazılır. Her dosya tanıtıcı aşağıdaki dosya tanıtıcı 1'den okur ve kendisine ekler.

Komut satırı

bashlinuxhint.com/yapı/test-read-fd.sh treni10

Çıktı

fds başlatılıyor...
fd başlatılıyor3...
fd3başlatılmış
fd başlatılıyor4...
fd4başlatılmış
fds başlatıldı
fd'den okumak3ve4...
4 3
temizlemeden önce fds
0 1 2 3 4 5
temizlemek ...
fds'yi temizleme ...
tamamlamakfds'yi temizlemek
temizlendikten sonra fds
0 1 2 3

read -u FD kullanarak işlevi atla

eğer koşuyorsan

Adın -ile
MINGW64_NT-10.0MASAÜSTÜ-XVVVVVV 2.7.0(0.307/5/3)
2017.-02-17 14:yirmix86_64 Msys
bash --versiyon
GNUbash, sürüm 4.4.12(1)-serbest bırakmak(x86_64-pc-msys)

betik kaynağı okunmadan önce işlevlerin dışında bir bash betiğinde aşağıdaki satırı atlayan bir atlama işlevini uygulamak için bir hata nedeniyle mümkün olabilir. Çoğu sistemde çalışmadığını unutmayın. Örneğin,

Adın -ile
Linux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
bash --versiyon
GNUbash, sürüm 4.4.12(1)-serbest bırakmak(x86_64-pc-linux-gnu)

atlama uçmaz.

İşlev

atlamak() { okuman -u 31;}

Komutlar

atlamak
dışarı attısatır atlandı
NS

Çıktı

(boş)

Sonuç olarak

Bash'deki read yerleşik, kullanıcı girdisini yakalamaktan daha fazlasını yapar. Bash betiklerinde kullanılan dosya tanımlayıcıları arasındaki işlevlerde, döngülerde ve değiş tokuşlarda kullanılabilir. Ara sıra okuma ve dosya tanımlayıcıları kullanarak keşif yapmak Paskalya yumurtaları verebilir.