הרחבות בלתי צפויות
ייתכן שיש שגיאות המתרחשות רק לסירוגין בסקריפט. לפעמים הסקריפט יפעל בסדר ובפעמים אחרות הוא ייכשל בגלל תוצאות הרחבה. אם נחזיר את הנקודה-פסיק החסרה ונשנה את הערך של מספר למשתנה ריק, אנחנו
יכול להדגים:
#! / bin / bash
# בעיה: סקריפט להדגמת שגיאות נפוצות
מספר=
if [$number = 1]; לאחר מכן
echo "מספר שווה ל-1." אַחֵר
echo "המספר אינו שווה ל-1."
fi
#! / bin / bash
# בעיה: סקריפט להדגמת שגיאות נפוצות
מספר=
if [$number = 1]; לאחר מכן
echo "מספר שווה ל-1." אַחֵר
echo "המספר אינו שווה ל-1."
fi
הפעלת הסקריפט עם השינוי הזה מביאה לפלט:
[me@linuxbox ~]$ צרה
/home/me/bin/trouble: שורה 7: [: =: צפי לאופרטור אונארי המספר אינו שווה ל-1.
[me@linuxbox ~]$ צרה
/home/me/bin/trouble: שורה 7: [: =: צפי לאופרטור אונארי המספר אינו שווה ל-1.
אנו מקבלים הודעת שגיאה די סתמית זו, ולאחריה את הפלט של השני הד פקודה. הבעיה היא ההתרחבות של מספר משתנה בתוך מבחן פקודה. כאשר הפקודה:
[$number = 1]
[$number = 1]
עובר הרחבה עם מספר בהיותו ריק, התוצאה היא כזו:
[= 1]
[= 1]
שאינו חוקי והשגיאה נוצרת. ה = אופרטור הוא אופרטור בינארי (הוא דורש ערך בכל צד), אבל הערך הראשון חסר, אז ה- מבחן הפקודה מצפה לאופרטור unary (כגון -z) במקום זאת. יתר על כן, מאז ה מבחן נכשל (בגלל השגיאה), ה if הפקודה מקבלת קוד יציאה שאינו אפס ופועלת בהתאם, והשנייה הד הפקודה מבוצעת.
ניתן לתקן בעיה זו על ידי הוספת מרכאות סביב הארגומנט הראשון ב- מבחן
פקודה:
[ "$number" = 1 ]
[ "$number" = 1 ]
לאחר מכן כאשר מתרחשת הרחבה, התוצאה תהיה כזו:
["" = 1]
["" = 1]
מה שמניב את המספר הנכון של טיעונים. בנוסף למחרוזות ריקות, יש להשתמש במירכאות במקרים שבהם ערך יכול להתרחב למחרוזות מרובות מילים, כמו בשמות קבצים המכילים רווחים מוטבעים.