פקודת קריאת Bash

Bash Read Command



תקראו או תמותו חברים. פקודת הקריאה חשובה לא פחות מהפרמטרים המיקומיים והפקודה הד. איך עוד אתה הולך לתפוס קלט משתמשים, לקבל סיסמאות, לכתוב פונקציות, ללחוץ ולהציץ למתארים של קבצים? תמשיך לקרוא.

מה קוראים?

קריאה היא פקודה מובנית bash שקוראת את תוכן השורה למשתנה. הוא מאפשר פיצול מילים הקשור למשתנה המיוחד של הקליפה IFS. הוא משמש בעיקר לתפיסת קלט משתמשים אך ניתן להשתמש בו כדי ליישם פונקציות שלוקחות קלט מקלט רגיל.







Bash קרא עזרה בפקודה מובנית

לפני שנצלול כיצד להשתמש בפקודת read בסקריפטים bash, הנה כיצד אנו מקבלים עזרה. שם אתה אמור לראות את כל האפשרויות הזמינות לפקודת הקריאה יחד עם תיאורים אותם ננסה לכסות בדוגמאות.



שורת פקודה



עֶזרָה לקרוא

תְפוּקָה





לקרוא:לקרוא [-ארים] [-מערך] [-שיתוף] [-אני מסמס] [-n nchars] [-N nchars]
[-p הנחיה] [פסק זמן] [-u fd] [שם ...]

קראו שורה מהקלט הסטנדרטי ו-לְפַצֵלזה לשדות.

קורא שורה אחת מהקלט הסטנדרטי, או מתוךקוֹבֶץמתאר FD
אםה-uהאפשרות מסופקת. הקו הואלְפַצֵללתוך שדותכפי שעם מילה
פיצול, והמילה הראשונה מוקצה ל- NAME הראשון, השני
מילה ל- NAME השני וכן הלאה, כאשר כל שאריות המילים מוקצות
האחרוןשֵׁם. נמצאו רק הדמויותב $ IFSמוכריםכפי שמִלָה
תוחמים.

אם לא מסופקים NAME, השורהלקרואמאוכסןבהמשתנה REPLY.

אפשרויות:
מערך הקצה את המיליםלקרואלמדדים עוקבים של המערך
משתנה ARRAY, החל מאפס
-dתוחםלְהַמשִׁיך עדהדמות הראשונה של DELIM היאלקרוא, יותר נכון
מאשר קו חדש
-ע השתמש ב- Readline כדי להשיג את השורהבמעטפת אינטראקטיבית
-אניטקסט השתמש ב- TEXTכפי שהטקסט הראשונילקריאת שורה
ncharsלַחֲזוֹרלאחר קריאת דמויות NCHARS במקום לחכות
לקו חדש, אך כבדו תוחםאםפחות מ

דמויות NCHARS הןלקרואלפני התוחם
-Nncharsלַחֲזוֹררק לאחר קריאת תווי NCHARS בדיוק, אלא אם כן
EOF נתקל אולקרוא פִּילצאת, תוך התעלמות מכל
תוחם
-pפלט הפק את המחרוזת PROMPT ללא שורה חדשה נגררת לפני
מנסה ללקרוא
-rלַעֲשׂוֹתלא לאפשר למתיחות לאחור להימלט מדמויות כלשהן
לַעֲשׂוֹתלֹאזרקקלט שמגיע ממסוף
פסק זמןזְמַןהחוצה ולַחֲזוֹרכישלוןאםללְהַשְׁלִיםשורה של
קלט אינולקרואתוך TIMEOUT שניות. הערך של
משתנה TMOUT הוא פסק הזמן המוגדר כברירת מחדל. TIMEOUT עשוי להיות א
מספר שבר. אם TIMEOUT הוא0,לקרואהחזרות
מיד, בלי לנסותלקרואכל נתונים, חוזרים
הצלחה בלבדאםקלט זמין במפורט
קוֹבֶץמתאר. היְצִיאָההסטטוס גדול מ128
אםחריגה מהפסק הזמן
-ufdלקרואמקוֹבֶץמתאר FD במקום הקלט הסטנדרטי

סטטוס יציאה:
הלַחֲזוֹרהקוד אפס, אלא אם כן נתקל בסוף הקובץ,לקרוא פִּיהַחוּצָה
(ב איזה מקרהזהגדול מ- 128), טעות בהקצאה משתנה

קלט קלט משתמשים

סקריפטים bash אינטראקטיביים הם דבר מבלי לתפוס קלט משתמשים. הקריאה מובנית מספקת שיטות שבהן קלט המשתמש עלול להיתפס בתוך סקריפט bash.

לתפוס שורה של קלט

כדי לתפוס שורה של קלט NAMEs ואפשרויות אינן נדרשות על ידי קריאה. כאשר NAME אינו מצוין, משתנה בשם REPLY משמש לאחסון קלט משתמשים.



פקודות

{
זרק 'הקלד משהו והקש Enter:';
לקרוא;
זרקהקלדת$ {REPLY}
}

תְפוּקָה

הקלד משהו והקש enter: משהו(שורה חדשה)
הקלדת משהו

לתפוס מילת קלט

כדי לתפוס מילה של קלט, יש צורך באפשרות -d. במקרה של מילה היינו מגדירים -d למרווח, נקרא '-d'. כלומר כאשר המשתמש לוחץ על מקש הרווח הקריאה תטען את המילה REPLY.

שים לב שכאשר האפשרות -d מוגדרת, הרווח האחורי אינו פועל כצפוי. כדי לחזור לאחור, תוך ניסיון לתפוס מילת קלט, ניתן להשתמש באפשרות -e, לקרוא -e '-d'.

פקודות

{
זרק 'הקלד משהו והכה רווח:';
לקרוא '-d';
זרק '';
זרק 'הקלדת$ {REPLY}'
}

תְפוּקָה

הקלד משהו והכה רווח: משהו(מֶרחָב)
הקלדת משהו

משתמש מהיר

בסקריפטים bash אינטראקטיביים שהמשתמש יכול לדרוש מהמשתמש הודעה כדי לספר למשתמש מה הקלט הצפוי. אנחנו תמיד יכולים להשיג זאת באמצעות הד המובנה. עם זאת, מסתבר שיש אפשרות להשתמש ב- read.

בקש מהמשתמש מילה

בתפיסת מילת קלט, השתמשנו בהד כדי לכתוב הקלד משהו ופגע ברווח: לפלט סטנדרטי לפני קריאת '-d'. האפשרות -p מאפשרת הצגת הודעה לפני קריאה מתוך קלט רגיל.

פקודות

{
לקרוא -p 'הקלד משהו והכה רווח:' '-d';
זרק '';
זרק 'הקלדת$ {REPLY}'
}

תְפוּקָה

הקלד משהו והכה רווח: משהו(מֶרחָב)
הקלדת משהו

בקש מהמשתמש סוד

כאשר תופסים קלט משתמשים מבלי שיופיעו במסוף, אפשרות -s שימושית. read -s -p מאפשר לך לתפוס ולהסתיר קלט משתמשים כדלקמן.

פקודות

{
לקרוא -p 'הקלד משהו שאני מבטיח לשמור אותו בסוד:'
זרק '';
זרק 'הסוד שלך בטוח איתי';לא מוגדרתשובה ;
זרק '$ {REPLY}'
}

תְפוּקָה

הקלד משהו שאני מבטיח לשמור אותו בסוד:
הסוד שלך בטוח איתי

פונקציות באמצעות קריאה

להלן דוגמאות לפונקציות ב- bash המשתמשות בקריאה ובקלט סטנדרטי

עיקרון יסוד

פונקציות באמצעות קריאה משתמשות בקלט ובפרמטרים סטנדרטיים. הקלט העיקרי לעיבוד כגון קווים בקובץ מועבר דרך קלט סטנדרטי באמצעות צינור. קלט אחר אם כל ואופציה מועברים כפרמטרים.

לקרוא 1NAME1 NAME2 ...

לקרואהואמובנה פקודה

-t 1 מונע מתסריט ה- bash לחכות ללא הגבלת זמן להחזרת שורה באמצעות קלט סטנדרטי. אם הקלט הסטנדרטי ריק בתחילה, הפונקציה חוזרת עם קוד יציאה של 142 המציין כי לא נקרא תאריך בתוך תקופת הזמן הקצוב שהוגדר.

NAME1 NAME2 הם שמות משתנים

... רשומים שמות משתנים רבים

כעת, כאשר נקבעו עבודות היסוד, בואו נראה כיצד נראים פונקציות מוכרות המיושמות באמצעות קריאה.

הצטרף לפונקציה באמצעות קריאה

נניח שאנחנו רוצים פונקציית צירוף שלוקחת רשימה של מילים ומחזירה רשימה נוספת של מילים שמצטרפת אליהן מפריד. כך נוכל ליישם פונקציית הצטרפות באמצעות קריאה.

תַסרִיט

#!/bin/bash
## הצטרף
## גירסה 0.0.2 - תיקון פרמטרים של רקורסיה
##################################################
לְהִצְטַרֵף() { { מְקוֹמִימַגְבִּיל;מַגְבִּיל='$ {1-}';מְקוֹמִיoutdelimiter;
מגדיר מחוץ='$ {2-.}';}
מְקוֹמִיאוטו
מְקוֹמִיcdr
מְקוֹמִיIFS
IFS='$ {indelimiter}'
לקרוא 1מכונית cdr|| לַחֲזוֹר
מִבְחָן '$ {cdr}' || { זרק '$ {רכב}';לַחֲזוֹר;}
זרק '$ {רכב}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
##################################################
## נוצר על ידי create-stub2.sh v0.1.2
## ביום שני, 17 ביוני 2019 12:24:59 +0900
## רואים
##################################################

מָקוֹר: join.sh
שורת פקודה

זרקא ב| לְהִצְטַרֵף

תְפוּקָה

א.ב

שורת פקודה

זרקא ב| לְהִצְטַרֵף | לְהִצְטַרֵף. |

תְפוּקָה

ל|ב

פונקציות מפה באמצעות קריאה

נניח שאנחנו רוצים פונקציית מפה שלוקחת רשימה ומחזירה רשימה נוספת המכילה את אותו מספר אלמנטים שמשתנים על ידי פונקציה אחרת. כך נוכל ליישם פונקציית מפה באמצעות קריאה.

תַסרִיט

#!/bin/bash
## מפה
## גרסה 0.0.1 - ראשונית
##################################################
מַפָּה() { { מְקוֹמִישם פונקציה;שם פונקציה='$ {1}';}
מְקוֹמִיאוטו
מְקוֹמִיcdr
מְקוֹמִיIFS
IFS='$ {indelimiter-}'
לקרוא 1מכונית cdr|| לַחֲזוֹר
מִבְחָן '$ (הצהיר -f $ {function_name})' || לַחֲזוֹר
מִבְחָן '$ {רכב}' || { נָכוֹן;לַחֲזוֹר;}
$ {function_name} $ {רכב}
זרק '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
##################################################
## נוצר על ידי create-stub2.sh v0.1.2
## ביום שלישי, 18 ביוני 2019 08:33:49 +0900
## רואים
##################################################

מָקוֹר: map.sh
פקודות

NS() { מְקוֹמִי -אני אני=$ {1};זרק$((אני** 2 ));}
זרק {1..10} |מפה pow

תְפוּקָה

1
4
9
16
25
36
49
64
81
100

פונקציית סינון באמצעות קריאה

נניח שאנחנו רוצים פונקציית סינון שלוקחת רשימה ומחזירה רשימת משנה של אלמנטים המשביעים תנאים שהוגדרו על ידי פונקציה אחרת. כך נוכל ליישם פונקציית סינון באמצעות קריאה.

תַסרִיט

#!/bin/bash
מסנן ##
## גרסה 0.0.1 - ראשונית
##################################################
לְסַנֵן() { { מְקוֹמִישם פונקציה;שם פונקציה='$ {1}';}
מְקוֹמִיאוטו
מְקוֹמִיcdr
מְקוֹמִיIFS
IFS='$ {indelimiter-}'
לקרוא 1מכונית cdr|| לַחֲזוֹר
מִבְחָן '$ (הצהיר -f $ {function_name})' || לַחֲזוֹר
מִבְחָן '$ {רכב}' || { נָכוֹן;לַחֲזוֹר;}
$ {function_name} '$ {רכב}' || זרק '$ {רכב}'
זרק '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
##################################################
## נוצר על ידי create-stub2.sh v0.1.2
## ביום שלישי, 18 ביוני 2019 13:19:54 +0900
## רואים
##################################################

מָקוֹר: filter.sh

פקודות

מוזר() { מְקוֹמִי -אני אני=$ {1};מִבְחָן !$((אני% 2 )) -משווה 1;}
זרק {1..10} |מסנן מוזר

תְפוּקָה

1 3 5 7 9

לולאות באמצעות קריאה

לולאות באמצעות קריאה מאפשרות לך לחזור על שורות של קובץ שאמור להיווצר או שכבר קיים.

לולאה בסיסית בזמן קריאה בצד השמאלי (lhs)

יש לנו פקודה או פונקציה (lhs) שיכולים ליצור שורות בקובץ שניתן ללולאה באמצעות לולאה קריאה ו- while.

לִבנוֹת

lhs| בזמן לקרוא
לַעֲשׂוֹת
נָכוֹן
בוצע
lhs הוא אפקודהשמחזירה רשימת שורות

פקודות

סיק 5 | בזמן לקרואאני
לַעֲשׂוֹת
זרק $ {i}
בוצע

תְפוּקָה

1
2
3
4
5

לולאה בסיסית בזמן קריאה בצד ימין (rhs)

יש לנו קובץ (rhs) עם שורות שניתן ללוף באמצעות לולאה קריאה ו- while.

לִבנוֹת

בזמן לקרוא
לַעֲשׂוֹת
נָכוֹן
בוצע <rhs

rhs הוא אקוֹבֶץהמכיל קווים

פקודות

סיק 5 >rhs
בזמן לקרואאני
לַעֲשׂוֹת
זרק $ {i}
בוצע <rhs

תְפוּקָה

1
2
3
4
5

Lhs מותאם אישית תוך לולאה באמצעות קריאה

יש לנו זרם מילים שברצוננו לחבר באמצעות קריאה.

לִבנוֹת

(
IFS=''
lhs| בזמן לקרוא
לַעֲשׂוֹת
נָכוֹן
בוצע
)

lhs היא רשימת מילים

פקודות

(
IFS=''
זרק {1..5} | בזמן לקרואאני
לַעֲשׂוֹת
זרק '$ {i}
בוצע
)

תְפוּקָה

1 2 3 4 5

קריאה מכל fd במקום קלט רגיל

האפשרות מובנית לקריאה שנותרת ללא פגע היא זו המאפשרת לך לפרט מאיזה מתאר קבצים לקרוא, לקרוא -ו FD. כברירת מחדל FD נחשב כקלט סטנדרטי.

עיקרון יסוד

כאשר קובצי קובץ נפתחים מוקצים. ניתוב IO בבאש מאפשר להשאיר קובץ פתוח עם מתאר קבצים ספציפי. מותר לנו לכתוב לקובץ, לקרוא ממנו ולסגור אותו כשסיימנו.

_()
{
חתול /dev/ריק>myfifo;# myfifo ריק
מנהל 3<myfifo;# פתח קובץ myfifo כ- fd 3
זרק 'שלום עולם! - מ fd 3 ' >myfifo;# כתוב ל- myfifo
לקרוא -u 3;# לקרוא שורה מתוך fd 3
מנהל 3> &-;# קרוב fd 3
זרק $ {REPLY} # קו פלט נקרא מ- fd 3 לפני הסגירה
}
_# שלום עולם! מ fd 3

בניית רכבת עם תיאורי קבצים ו- FD קריאה

רק בשביל הכיף החלטתי לבנות רכבת עם תיאורי קבצים ו- FD. לכל מתאר קובץ כתוב מספר. כל מתאר קבצים קורא מתוך מתאר הקבצים 1 להלן ומתווסף לעצמו.

שורת פקודה

לַחֲבוֹטlinuxhint.com/לִבנוֹת/רכבת test-read-fd.sh10

תְפוּקָה

אתחול fds ...
אתחול fd3...
fd3מתוחכם
אתחול fd4...
fd4מתוחכם
fds התפתח
קריאה מ fd3ו4...
4 3
fds לפני הניקוי
0 1 2 3 4 5
ניקיון ...
לנקות fds ...
בוצעניקוי fds
fds לאחר הניקוי
0 1 2 3

פונקציית דילוג באמצעות read -u FD

אם אתה רץ

ללא שם
MINGW64_NT-10.0שולחן עבודה-XVVVVVV 2.7.0(0.307/5/3)
2017.-02-17 14:עשריםx86_64 Msys
לַחֲבוֹט --גִרְסָה
GNUלַחֲבוֹט, גרסה 4.4.12(1)-לְשַׁחְרֵר(x86_64-pc-msys)

יתכן שיהיה אפשרי עקב באג ליישם פונקציית דילוג שמדלגת על השורה הבאה בתסריט bash מחוץ לפונקציות לפני קריאת מקור הסקריפט. שים לב שזה לא עובד ברוב המערכות. לדוגמה,

ללא שם
לינוקס 4.9.0-8-amd64מספר 1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
לַחֲבוֹט --גִרְסָה
GNUלַחֲבוֹט, גרסה 4.4.12(1)-לְשַׁחְרֵר(x86_64-pc-linux-gnu)

דילוג לא עף.

פוּנקצִיָה

לדלג() { לקרוא -u 31;}

פקודות

לדלג
זרקקו דילג
נָכוֹן

תְפוּקָה

(ריק)

שורה תחתונה

הקריאה המובנית ב- bash עושה יותר מאשר לתפוס קלט משתמשים. ניתן להשתמש בו בפונקציות, לולאות והחלפות בין מתארים של קבצים המשמשים בתסריטים bash. מדי פעם חקירה באמצעות מתאמי קריאה וקבצים עשויה להניב ביצי פסחא.