Puncte:2

Script Bash: comanda „citește” nu răspunde

drapel in

Eu scriu un script bash care va

  1. Descărcați codul html al unui site într-un fișier „index.html”
  2. Solicitați utilizatorului tipul de fișier și căutați „index.html” pentru numărul de tipuri de fișiere potrivite

Aceasta este funcția care va finaliza pasul 2:

1. funcția findFiles() {
2. echo „Introduceți tipul de fișier pentru a căuta (include „.”) || Tastați EXIT pentru a încheia programul „
3. citiți fileType
4.
5. în timp ce [[ "$fileType" != "EXIT" ]];
6. face
7. dacă [[ $(grep -q $fileType index.html) = 1 ]]; atunci
8. grep -F „$fileType” index.html >> foundFiles.txt
9. fi
10. făcut
11.
12. rm index.html
13.};

Când este executat, linia 3 solicită introducerea utilizatorului, dar nu răspunde când apăsez enter, următorul exemplu:

2021-09-26 12:41:06 (2,66 MB/s) - âindex.htmlâ salvat [94126]

Introduceți tipul de fișier pentru a căuta (include „.”) || Tastați EXIT pentru a încheia programul 
.pdf
.TXT



foo
aaaa

Am încercat să declar o variabilă locală $fileType în primul rând, folosind citește -p și punând punct și virgulă la sfârșitul rândului 3. Rezultatul este întotdeauna același și nu am reușit să găsesc o soluție. Sunt conștient de faptul că ceea ce urmează linia 3 este defectuoasă, dar aș dori doar ajutor cu linia 3, deoarece următoarele linii sunt ceva la care aș dori să lucrez pentru a afla mai multe despre scripting-ul bash.

Orice idei sunt apreciate.

muru avatar
drapel us
Arată-ne cum executați această funcție.
Puncte:4
drapel cn

Nu trebuie să răspundă. Face exact ceea ce ar trebui: citește intrarea și o atribuie variabilei tip fișier. Cu toate acestea, atunci aveți un in timp ce buclă care verifică valoarea unei variabile care nu se schimbă niciodată:

while [[ "$fileType" != "EXIT" ]];

Din moment ce valoarea de $fileType este setat o singură dată și înainte de in timp ce buclă, că in timp ce devine o buclă infinită dacă nu treci IEȘIRE la prima încercare. În orice caz, scriptul tău nu ar funcționa oricum de la ieșirea lui grep -q model fișier nu va fi niciodată 1. De fapt, va fi mereu gol, deoarece asta este grep -q face. Bănuiesc că ai vrut să verifici starea de ieșire a comenzii, dar chiar și asta nu are rost: nu există niciun beneficiu să citești întregul fișier o dată cu grep -q doar ca apoi să o citească din nou cu grep -F.

Iată o versiune funcțională a funcției dvs.:

funcția findFiles() {
  while [[ "$fileType" != "EXIT" ]];
  do
    echo „Introduceți tipul de fișier pentru a căuta (include „.”) || Tastați EXIT pentru a încheia programul „
    citiți tipul fișierului
    grep -F „$fileType” index.html >> foundFiles.txt
  Terminat
     rm index.html
 };

Sau, dacă doriți să evitați crearea unui gol foundFiles.txt dacă nu au fost găsite potriviri, puteți încerca:

funcția findFiles() {
  while [[ "$fileType" != "EXIT" ]];
  do
    echo „Introduceți tipul de fișier pentru a căuta (include „.”) || Tastați EXIT pentru a încheia programul „
    citiți tipul fișierului
    if grep -qm1 "$fileType" index.html; atunci
      grep -F „$fileType” index.html >> foundFiles.txt
    fi
  Terminat
     rm index.html
 };

The -m asigură cel grep iese după prima potrivire, astfel încât nu trebuie să citiți întregul fișier de două ori. Rețineți că nu folosesc înlocuirea comenzii ($(comandă)) deoarece verific dacă comanda a avut succes și nu încerc să-i folosesc rezultatul.

Bubbles avatar
drapel in
Da! Mulțumesc, asta mi-a rezolvat problema și înțeleg soluția ta, ceea ce mă ajută foarte mult. Voi lucra la script pentru a mă asigura că face exact ceea ce încerc să-l fac să facă.
Puncte:1
drapel cn

Se pare că te prinzi într-o buclă nesfârșită. Dacă utilizatorul nu a tastat „EXIT”, atunci in timp ce bucla va continua pentru totdeauna. Orice text suplimentar pe care îl tastați este transmis doar la terminal.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.