OnWorks Linux ו-Windows Online WorkStations

לוגו

אירוח מקוון בחינם עבור תחנות עבודה

<הקודם | תוכן | הבא>

IFS

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

אנחנו יכולים להתאים את הערך של IFS כדי לשלוט בהפרדה בין שדות לקלט לקרוא. לדוגמא, ה / etc / passwd הקובץ מכיל שורות נתונים המשתמשות בתו נקודתיים כמפריד שדות. על ידי שינוי הערך של IFS לנקודתיים בודדת, נוכל להשתמש לקרוא להזין את התוכן של / etc / passwd ולהפריד בהצלחה שדות למשתנים שונים. הנה יש לנו סקריפט שעושה בדיוק את זה:



#! / bin / bash

# read-ifs: קרא שדות מקובץ FILE=/etc/passwd

#! / bin / bash

# read-ifs: קרא שדות מקובץ FILE=/etc/passwd


read -p "הזן שם משתמש > " user_name file_info=$(grep "^$user_name:" $FILE) if [ -n "$file_info" ]; לאחר מכן

IFS=":" read user pw uid gid home shell <<< "$file_info" echo "User = '$user'"

echo "UID = '$uid'"

echo "GID = '$gid'" echo "Full Name = '$name'" echo "Home Dir. = '$home'" echo "Shell = '$shell'"

אחר

echo "אין משתמש כזה '$user_name'" >&2 יציאה 1

fi

read -p "הזן שם משתמש > " user_name file_info=$(grep "^$user_name:" $FILE) if [ -n "$file_info" ]; לאחר מכן

IFS=":" read user pw uid gid home shell <<< "$file_info" echo "User = '$user'"

echo "UID = '$uid'"

echo "GID = '$gid'" echo "Full Name = '$name'" echo "Home Dir. = '$home'" echo "Shell = '$shell'"

אחר

echo "אין משתמש כזה '$user_name'" >&2 יציאה 1

fi


סקריפט זה מבקש מהמשתמש להזין את שם המשתמש של חשבון במערכת, ולאחר מכן מציג את השדות השונים שנמצאו ברשומת המשתמש ב- / etc / passwd קוֹבֶץ. התסריט מכיל שתי שורות מעניינות. הראשון הוא:

file_info=$(grep "^$user_name:" $FILE)

שורה זו מקצה את התוצאות של א grep פקודה למשתנה file_info. הביטוי הרגולרי בשימוש על ידי grep מבטיח ששם המשתמש יתאים רק לשורה בודדת ב- / etc / passwd קובץ.

השורה המעניינת השנייה היא זו:

IFS=":" read user pw uid gid home shell <<< "$file_info"

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

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

OLD_IFS="$IFS" IFS=":"

קרא משתמש pw uid gid שם בית מעטפת <<< "$file_info" IFS="$OLD_IFS"

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


הפקודה היא דרך תמציתית יותר לעשות את אותו הדבר.

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

קובץ /etc/passwd מוזן לקלט הסטנדרטי של פקודת הקריאה. אולי נזכה-

מדוע נבחרה השיטה האלכסונית הזו ולא:

echo "$file_info" | IFS=":" קרא משתמש pw uid gid home shell

תמונה

ובכן, יש סיבה...


אתה לא יכול לקרוא בפייפ

בעוד לקרוא הפקודה לוקחת בדרך כלל קלט מקלט רגיל, אתה לא יכול לעשות זאת:

הד "פו" | לקרוא

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

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

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

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


מחשוב ענן מערכת ההפעלה המוביל ב-OnWorks: