Tutorial 7 C-SHELL שימו תרגול זה אינו התרגול הרישמי של הקורס. הוא מבוסס על חוברת התרגולים אך מכיל שינויים, הסברים נוספים ודוגמאות שונות או נוספות.

גודל: px
התחל להופיע מהדף:

Download "Tutorial 7 C-SHELL שימו תרגול זה אינו התרגול הרישמי של הקורס. הוא מבוסס על חוברת התרגולים אך מכיל שינויים, הסברים נוספים ודוגמאות שונות או נוספות."

תמליל

1 Tutorial 7 C-SHELL שימו תרגול זה אינו התרגול הרישמי של הקורס. הוא מבוסס על חוברת התרגולים אך מכיל שינויים, הסברים נוספים ודוגמאות שונות או נוספות.

2 C SHELL Tutorial 7 1 Unix תוכ ניו ת ס טנד רטי ות - ב בכל מחשב אשר מותקנת בו מערכת הפעלה מסוג Unix מותקנות בנוסף מספר תוכנות סטנדרטיות אשר ניתן להיעזר בהן. היום נראה מספר תוכניות אלו ודרכים לשלב ביניהן. 2 Masha Nikolski, CS Department, Technion 1

3 קבלת רשימת הקבצ ים במ דריך ls הפקודה מדפיסה את רשימת הקבצים הנמצאים במדריך הנוכחי. אופציות: מאפשרת לראות את רשימת הקבצים במדריך הנוכחי באופן מפורט יותר. מאפשרת לראות בנוסף גם קבצים נסתרים (קבצים ששמם מתחיל ב - "." בד"כ קבצי אתחול לתוכניות שונות). -l -a 3 קבלת רשימת הקבצ ים במ דריך > ls -l total 72 drwxr-xr-x 6 nikol Nov 22 18:30. drwxr-xr-x 8 nikol bin 3072 Dec 17 22:14.. drwxr-xr-x 2 nikol Nov 22 17: rw-r--r-- 1 nikol Apr 24 11:23 homepage.css drwxr-xr-x 2 nikol Apr 30 18:30 images -rwxr-xr-x 1 nikol Nov 22 17:48 index.html permissions directories owner group size date file drwxr-xr-x 6 nikol Nov 22 18:30. drwxr-xr-x 8 nikol bin 3072 Dec 17 22:14.. drwxr-xr-x 2 nikol Nov 22 17: rw-r--r-- 1 nikol Apr 24 11:23 homepage.css drwxr-xr-x 2 nikol Apr 30 18:30 images -rwxr-xr-x 2 nikol Nov 22 17:48 index.html total number of all files in blocks of 512 bytes 4 Masha Nikolski, CS Department, Technion 2

4 סקירת תוכן קבצי ם cat file_1 file_2 file_k הפקודה מדפיסה את תוכן הקבצים לפלט הסטנדרטי. אופציות: n- ממספרת את השורות בקובץ. > cat > temp Here it goes > cat temp Here it goes 5 סקירת תוכן קבצי ם head [-n] [files] הפקודה מדפיסה את 10 השורות הראשונות בקובץ. אופציות: n- מדפיסה את n השורות הראשונות בקובץ. 6 Masha Nikolski, CS Department, Technion 3

5 סקירת תוכן קבצי ם tail [options] [files] הפקודה מדפיסה את 10 השורות האחרונות בקובץ. אופציות:.n מדפיסה את n השורות האחרונות בקובץ. מדפיסה את כל השורות האחרונות בקובץ החל משורה -n +n 7 שילוב תוכנ יות נרצה להדפיס את השורות.myfile השנייה והשלישית של קובץ בשם > head -3 < myfile > first3 > tail -2 < first3 נראה דרך פשוטה יותר לביצוע משימה זו של הפניית פלט של תוכנית אחת לקלט של התוכנית הבאה ע"י שימוש ב - - pipelining העברה ישירה של פלט תוכנית אחת לקלט של תוכנית אחרת. 8 Masha Nikolski, CS Department, Technion 4

6 Pipelining < program1 > < program2 > גורמת לכד ש - program2 לוקחת כקלט את הפלט של.program1 ניתן לבצע שרשור מסוג זה למספר תוכניות, כך שכל תוכנית לוקחת כקלט את הפלט של קודמתה, ומעבירה את הפלט שלה לבאה אחריה ברשימה. > cat myfile head -3 tail -2 > ls File1.txt file2.txt temp temp2 > ls head -3 File1.txt file2.txt temp 9 Pipelining tee [options] [files] שומרת את הפלט אשר מוציאה פקודה הנמצאת באחד השלבים הפנימיים של ה.pipeline משכפלת את כל מה שנכנס לקלט הסטנדרטי שלה ושולחת אותו הן לפלט הסטנדרטי והן לכל אחד מהקבצים. אופציות: a- משרשרת לסוף קובץ. אם בנוסף להצגת השורה השנייה והשלישית נרצה לשמור את שלושת השורות הראשונות של הקובץ myfile בשני קבצים שונים, נוכל לבצע: > head -3 myfile tee file1 file2 tail Masha Nikolski, CS Department, Technion 5

7 פקודו ת sort [options] [files] הפקודה ממיינת את שורות הקבצים. אופציות: תבולציה בתחילת השורה. התעלם מרווחים וסימני b- (התעלם מפיסוק). בצע מיון בסדר מילוני d-.uppercase/lowercase התעלם מהבדלי f- מוינו לקובץ אחד. מזג מספר קבצים שכבר m- ערך מספרי. השווה על פי n-.file הדפס את הפלט בקובץ o- file הפוך את סדר המיון. r- שורות זהות תופענה בפלט פעם אחת בלבד. u- n המילים הראשונות. לפני ביצוע המיון דלג על n+ 11 > cat data World would for Father > sort data Father World for would > sort data -f Father for World would > sort data -r would for World Father > ls -l total 6 -rw romano root 23 Nov 8 23:09 data -rw romano Nov 8 23:12 ex1 -rw romano Nov 8 23:22 ex2 -rw romano Nov 10 13:30 ex3 > ls -l sort +4 > lsdata > more lsdata lsdata total 6 -rw romano Nov 10 13:30 ex3 -rw romano root 0 Nov 10 13:31 lsdata -rw romano root 23 Nov 8 23:09 data -rw romano Nov 8 23:12 ex1 -rw romano Nov 8 23:22 ex2 12 Masha Nikolski, CS Department, Technion 6

8 פקודו ת grep [options] [^]word [files] word files שורות בהן מופיעה המילה מחפשת בקבצים וכותבת אותם בפלט הסטנדרטי. אופציות: הקדם לכל שורת פלט את מספר הבלוק שלה. b- הדפס רק את מספר השורות שנמצאו. c- בהם השורות עצמן ללא שמות הקבצים, הדפס את השורות h- נמצאו..uppercase/lowercase התעלם מהבדלי i- ללא הדפסת הדפס רק את שמות הקבצים בהם השורות נמצאו l- השורות עצמן. הדפס את השורות ואת מספרן בקבצים. n-.word מופיעה בהן לא הדפס את כל השורות, v- מופיעה word בדיוק (לא כתת בהן הדפס את כל השורות w- מחרוזת)..word - הדפס את כל השורות המתחילות ב ^word 13 > ls ex/ ex2 ex4 file1 exl ex3 file2 > ls grep ex ex/ exl ex2 ex3 ex4 > ls grep -c ex 5 > more file1 Arik! Have you heard the news? If not, listen! > cat file2 Tomorrow we have a new exam! So we cannot go to Ran's birthday. Bye. > grep -v -n new * sort -n head -3 file1:1:arik! file2:2:so we cannot go to Ran's birthday. file2:3:bye. > ls filel file2 typescript > cat file1 file2 Arik! Have you heard news? If not, listen! Tomorrow we have a new exam! So we cannot go to Ran's birthday. Bye. > cat file2 file1 grep new sort -d -o news > more news Have you heard news? If not, listen! Tomorrow we have a new exam! 14 Masha Nikolski, CS Department, Technion 7

9 פקודו ת uniq [options][file1 [file2]] file1 את כל השורות הזהות הממוין מורידה מהקובץ (או file2 לקובץ הסמוכות,ושולחת עותק אחד של כל שורה file2 לערוץ הפלט הסטנדרטי). בהעדר הקובץ אופציות: הדפס כל שורה פעם אחת בלבד וספור עותקים של כל c- שורה. אך לא שורות הדפס שורות המופיעות יותר מפעם אחת, d- המופיעות פעם אחת בלבד. הדפס רק את השורות המופיעות פעם אחת בדיוק. u- (לפני קבלת ההחלטה אם n המילים הראשונות - מ התעלם n- שתי מילים זהות). 15 > more file3 one two two three three three > uniq file3 list > more list one two three > more names Uri Dan Uri Elena Alex Ofra Uri Ofra > sort names uniq -d Ofra Uri > 16 Masha Nikolski, CS Department, Technion 8

10 פקודו ת cut options [files] רצויים מכל אחת מהשורות מקבצי בוחרת תווים או שדות.files הקלט מתוך תווים מסוים או קבוצת מאפשר לבחור תו אופציות: -c list list מופיעים - כאשר ב מסוימת, שורה הרצויים. התווים המספרים של מתוך שורה מאפשר לבחור שדה או קבוצת שדות f- list list מופיעים המספרים של - כאשר ב מסוימת, הרצויים. השדות מאפשרת לקבוע מי התו f-. משמשת בנוסף לאופציה d c - שדה הינה קבוצת תווים בין השדות. המפריד.<tab> ברירת המחדל היא התו המסתיימת בתו c. 17 > cat filel a11 a12 a13 a14 a15 b21 b22 b23 b24 b25 c31 c32 c33 c34 c35 > cut c1-3,5,8-10 file1 a11a a1 b21b b2 c31c c3 > cut -d" " - f2,4 file1 a12 a14 b22 b24 c32 c34 > cat file2 a11:a12:a13 b21:b22 c31 c32 c33 > cat file2 cut -d":" -fl all b21 c31 c32 c33 > cat file2 cut -d":" -f3 al3 c31 c32 c33 18 Masha Nikolski, CS Department, Technion 9

11 פקודו ת wc [options] [files] התווים,המילים או השורות מאפשרת הדפסת ספירה של מספר בקבצים שונים. אופציות: התווים בלבד. הדפס את מספר c- הדפס את מספר השורות בלבד. l- הדפס את מספר המילים בלבד. w- אם לא ניתנת אופציה ניתן הפלט בפורמט : <# lines> <# words> <# chars> filename אם ניתנים כמה שמות קבצים מופיע גם סיכום. 19 > wc -l phonebook 12 phonebook > wc -w bible bible > wc -c data 8843 data > wc data data > wc data phonebook data phonebook total 20 Masha Nikolski, CS Department, Technion 10

12 פלט מ פורמט הפורמט printf format strings מדפיסה את המחרוזת string לפי הפורמט.format יכול להכיל תווים רגילים או תווי עריכה. אופציות:.strings מדפיסה את המחרוזת המתאימה מתוך הרשימה s% %[-][n.m]s - מדפיסה את המחרוזת המתאימה מרשימת המחרוזות כך שהתוצאה תהיה באורך של n תווים, אם אפשרות להגבלת מספר התווים המודפסים (מתוך המחרוזת הספציפית) ל - m. המחרוזת מיושרת לימין אלא אם כן משתמשים באופרטור > echo $HOME /home/rotics > printf "My files are in %s\n" $HOME My files are in /home/rotics > printf "number is: %lo.5s" a number is: > printf "number is: #%-10.3s #%s\n" " a" xxx number is: #123 #xxx > printf "My files are in %s\n" $HOME "my PC" My files are in /home/rotics My files are in my PC 22 Masha Nikolski, CS Department, Technion 11

13 C SHELL במערכת ההפעלה Unix יש רכיב תוכנה שתפקידו לשמש מנשק בין המשתמש למערכת ההפעלה. שמו של רכיב זה הוא.shell תפקידו של ה - shell הנו לקיים את הקשר עם המשתמש ולקבל ממנו את הפקודות לביצוע. 23 Shell אפשרו יות ב - ה shell מאפשר למשתמש לבצע "קיצורי דרך": - הגדרת שמות קצרים לפקודות שהמשתמש מבצע פעמים רבות. הגדרה ושימוש במשתנים. זכירת הפקודות שהמשתמש ביצע בעבר ואפשור שלהן ללא צורך בהקלדתן מחדש. ביצוע מהיר אפשרות להתייחס למספר קבצים בקיצור. 24 Masha Nikolski, CS Department, Technion 12

14 תפקיד יו של ה - Shell ה - shell מבצע את תפקידו בשתי דרכים: אינטראקטיבית: ה - shell מקבל פקודה מהמשתמש ומעבירה למערכת ההפעלה לביצוע. אצווה :(batch) ה - shell מאפשר לשמור סדרת פקודות בקובץ המכונה תסריט -,script ומאפשר למשתמש להריץ קובץ זה. הרצת קובץ זה תתבצע "כאילו" המשתמש הקיש פקודה אחר פקודה. 25 > alias del rm > del file2 > alias del rm Command Aliases alias <new name> <command name> נותן את השם new name לפקודה.command name.aliases - > alias cdx cd ~mtm/public/0607a/ex2 alias מציג את כל ה דוגמא 26 Masha Nikolski, CS Department, Technion 13

15 היסטו ריה ה - cshell שומר רשימה של הפקודות האחרונות שבוצעו. ניתן להשתמש ברשימה זו כדי לחזור על פקודות אלו..vi!! - יבצע שוב את הפקודה האחרונה.!vi - יבצע שוב את הפקודה האחרונה המתחילה ב - history מציג את רשימת הפקודות ברשימה. <n>! - יבצע שוב את הפקודה שמספרה n ברשימה. - shell זוכר אחורה ניתן לקבוע את מספר הפקודות אשר ה המשתנה.history > set history = 100 קביעת ערכו של על ידי 27 Filename Expansions ב Unix קיימות פקודות המקבלות מספר קבצים כפרמטרים. לכן, קיימת אפשרות לציין תבנית מסוימת, שפעולה תתבצע על כל הקבצים אשר שמותיהם מתאימים לתבנית. את התבנית בונים בעזרת תווים הנקראים.Wildcards כך קיימים שלושה :Wildcards * מתאים לאפס או יות ר תוו ים כלשה ם.? מתאים לבדי וק תו א חד כל שהוא..characters מתאים לאות אחת מתוך [<characters>] התווים יכולים להיות מצוינים מפורשות, או יכולים להיות מצוינים כתחום של אותיות. 28 Masha Nikolski, CS Department, Technion 14

16 Filename Expansions *.c כל הקבצים עם סיומת c. *AD* קבצים שבשמותיהם צירוף האותיות.AD.c gcc c *.c לקמפל את כל הקבצים עם הסיומת 29 Filename Expansions prog? כל הקבצים ששמותיהם מתחילים ב ולאחר,prog מכן יש - בדיוק תו אחד. rm prog1.? תמחק את כל הקבצים ששמותיהם מתחילים ב הנקודה יש בדיוק תו אחד. progl. ואחרי 30 Masha Nikolski, CS Department, Technion 15

17 Filename Expansions file ושאחרי file[13] מציין את כל הקבצים ששמותיהם מתחילים ב אותיות אלו מופיע או 1 או 3. - file[a-za-z13] מציין את כל הקבצים ששמותיהם מתחילים ב - file ושאחרי אותיות אלו מופיעה אחת מאותיות ה - א"ב האנגלי או אחת מהספרות 1 או cshell משתני ם ב - cshell מאפשר למשתמש לעשות שימוש במשתנים. המשתנים יכולים לקבל ערכים שהם מחרוזות, רשימות ומספרים שלמים. אין צורך להכריז על משתני :cshell המשתנים מוגדרים ברגע שמציבים להם ערכים. set <variable> = <value> יכול להיות: value מספרים שלמים 1. מחרוזת 2. רשימה של מחרוזות ומספרים Masha Nikolski, CS Department, Technion 16

18 cshell משתני ם ב - > set v = abc > set w = 123 > set u = ( ) > echo $v abc > echo $w 123 > echo $u משתני ם מספ ריים ב - cshell ניתן להשתמש במשתנים המכילים מספרים שלמים ולבצע עליהם פעולות חשבון פשוטות. בתחילת פקודה מסמן לחשב את הביטוי המספרי בפקודה..set לאתחול ערכו של משתנה לקבוע ניתן להיעזר בפקודה אולם בכדי לבצע פעולות חשבוניות חייבים להשתמש 34 Masha Nikolski, CS Department, Technion 17

19 משתני ם מספ ריים i = 3 > echo $i 3 i = $i + 1 > echo $i 4 i = $i++ > echo $i 5 > set v = 12 v = $v + $i > echo $v 17!יש לשים רו וח אחרי ביו ת אינה סטנדר טית ולפני ה פקודה =? = מחרוז ות ב -,cshell כל רצף של תווים נקרא מחרוזת, אולם אם רוצים לעבוד עם מחרוזות המכילות יותר ממילה אחת (מכילות רווחים) יש לתחום אותן בין גרשיים ) "" ). > set a = abc def ghe > echo $a abc def ghe שימו לב כי למרות מילה אחת. שהמחרוזת מכילה רווחים זו עדיין 36 Masha Nikolski, CS Department, Technion 18

20 רשימו ת 1 (ולא a ב - cshell מספור האיברים ברשימה מ מתחיל.(0 מ -.i עבור רשימה a, a[i] מציין איבר במקום ה > set v = (123 def ghi) > echo $v 123 def ghi > echo $v[2] def > set v[3] == ww > echo $v 123 def ww cshell לא תומך ברשימות מקוננות (רשימה בתוך רשימה) 37 פעולו ת על רשימו ת עבור משתנה a המכיל רשימה של ערכים {a#}$ מציין את מספר האיברים ברשימה. m - a, מציין את תת-הרשימה מהרשימה $a[m-n] מהאיבר ה.n עד לאיבר - ה מציין את תת-הרשימה מהרשימה a, עד לאיבר ה - n. מהאיבר הראשון $a[-n] m - מציין את תת-הרשימה מהרשימה,מהאיבר ה a $a[m-] עד לסוף הרשימה. [*]a$ מציין את הקבוצה המורכבת מכל איברי הרשימה. 38 Masha Nikolski, CS Department, Technion 19

21 פעולו ת על רשימו ת > set a = ( aa bb cc dd ee ) > echo $#a 5 > echo $a[3-] cc dd ee > echo $a[2-4] bb cc dd > echo $a[-3] aa bb cc 39 פעולו ת על רשימו ת עבור רשימת ערכים a,הפעולה shift a מזיזה את כל איברי הרשימה a מקום אחד שמאלה ומבטלת את האיבר הראשון. > set v = (go to the beach) > echo $v[1] go > shift v > echo $v[1] to > echo $v to the beach 40 Masha Nikolski, CS Department, Technion 20

22 נקו דות מתק דמ ות ב נו גע ל מש תני ם ניתן להתייחס לכל משתנה המכיל מחרוזת או מספר כרשימה בת איבר אחד. set a = "abc def ghi" > echo $a[1] abc def ghe > echo $a[2] a: Subscript out of range. ניתן לפרק מחרוזת לרשימת המילים המופיעות בה ע"י השמת המחרוזת בתוך סוגריים. >set b = ($a) >echo $b abc def ghi >echo $b[2] def 41 נקו דות מת קדמ ות בנו גע למש תני ם ניתן להשתמש בסוגריים מסולסלות בכדי להדגיש מהו שמו של משתנה. > set b = 123 > set a = ${b}4 > echo $a Masha Nikolski, CS Department, Technion 21

23 Command Substitution ב - cshell אפשר להשתמש בפקודות מקוננות, כלומר, בתוך פקודה מסוימת אפשר להשתמש בתוצאה של פקודה אחרת הכתובה בתוכה. על מנת לעשות זאת יש להקיף את הפקודה המקוננת בגרשיים הפוכים. אז מובטח כי היא תתבצע לפני ביצוע שאר השורה ותוחלף בערך המוחזר מביצוע הפקודה. > echo you have `ls wc -l` files in `pwd` you have 43 files in /home/rotics 43 Command Substitution > cat list file1 file2 file3 > cat filel you are in file1 Buy a Selkom phone > cat file2 you are in file2 buy Motorola Pelephone > cat file3 you are in file3 Im Grimberg Matzliah Ata Marviach > cat `cat list` you are in file1 Buy a Selkom phone you are in file2 buy Motorola Pelephone you are in file3 Im Grimberg Mazliah Ata Marviach 44 Masha Nikolski, CS Department, Technion 22

24 כיצד עובד C-shell ניתן לראות את ה - C-Shell כ - Processor Macro מתוחכם, העובד בלולאה: הצגת.prompt קבלת פקודה. ניתוח הפקודה, עיבודה וביצועה. C-Shell מנהלת מספר - תוכנית ה לצורך ביצוע עבודתה, מבני נתונים. רשימת הפקודות האחרונות שבוצעו. המשתנים. רשימת -.alias רשימת ה 45 כיצד עובד C-shell Tab משמשים - ניתוח הפקודה: הפקודה מופרדת למילים. כמפרידים בין מילים. התווים רווח ו עיבוד הפקודה: ביצוע החלפות לקבלת פקודה פשוטה. היסטוריה, משתנים וכד'. מבוצעות החלפות ביצוע הפקודה: הפקודה הפשוטה שהתקבלה מבוצעת. 46 Masha Nikolski, CS Department, Technion 23

25 כיצד עובד C-shell עיבוד הפקודה (ללא pipeline ו - (redirection 1. במידה והפקודה מכילה שימוש בפקודות קודמות (ע"י השימוש בסימן!) מתבצע.History Substitution שורת הפקודה שהתקבלה נשמרת ברשימת ההיסטוריה של הפקודות שבוצעו. במידה ובוצעו החלפות ההיסטוריה שורת הפקודה (לאחר ההחלפות) מודפסת למסך..2.3 אם המילה הראשונה בפקודה הנה שם של alias מתבצע.alias substitution 47 כיצד עובד C-shell.4 בצוע.variable substitution.5 בצוע.File name substitution.6 בצוע.command substitution ה - back-quoted string (`... `) מוחלפת בתוצאת הפקודה. 48 Masha Nikolski, CS Department, Technion 24

26 כיצד עובד C-shell ביצוע הפקודה לאחר בצוע כל ההחלפות הפקודה מבוצעת. פקודות: ישנן שתי סוגי - Shell ה פקודות חיצוניות ניתן להריץ כל תוכנית הקיימת במערכת. (במידה יפעיל את התוכנית ויעביר לה את הארגומנטים וניתנו לה). בכדי למצוא את התוכנית ניתן: לתת את מיקומה המדויק name).(full path לתת רק את שם התוכנית וה - C-Shell יחפשה. החיפוש יתבצע בכל המדריכים המופיעים ברשימה של המשתנה.path 49 כיצד עובד C-shell פקודות פנימיות: פקודות שניתנות לתוכנית ה - C-shell עצמה ומבוצעות ע"י ה - Shell שמפרש את הפקודה. פקודות פנימיות ההיסטוריה (history) ניהול (set/unset/shift) ניהול רשימת המשתנים - alias (alias/unalias) ניהול רשימת ה directory (cd) working - שינוי ה (בתרגול הבא) בקרת זרימה בתסריטים ניהול תהליכים 50 Masha Nikolski, CS Department, Technion 25

27 עיבוד הפקודה - נקודות מתקדמות ישנם מספר סוגי גרשיים: גרשיים כפולות quote) (double " גרש יחיד quote) (single ' גרש הפוך quote) (back ` back quotes משמשים לצורך.command substitution ה - shell מתייחס לכל המחרוזת בין ה - quotes back כאל פקודה אחת ומבצע אותה. תוצאת הפקודה מוחלפת במחרוזת הפקודה. במידה ובתוצאת הפקודה ישנם רווחים אזי ה - shell יתייחס לתוצאת הפקודה כאל מספר מילים. 51 עיבוד הפקודה - נקודות מתקדמות double quotes single quotes ו - משמשים בכדי לגרום ל - Shell להתייחס למספר מילים (מופרדות ברווחים וטבים) כאל מילה אחת. ע"י השמת מחרוזת בין גרשיים ניתן לגרום ל - Shell להתנהג באופן שונה מהרגיל. 52 Masha Nikolski, CS Department, Technion 26

28 עיבוד הפקודה - נקודות מתקדמות החלפת משתנים במידה ומופיעה התייחסות למשתנה בתוך ה - string double quoted המשתנה יוחלף בערכו. במידה וההתייחסות מופיעה בתוך single quoted string לא תתבצע החלפה. > set a = AAA > echo "a=$a" aaaa > echo 'a=$a' a=$a 53 עיבוד הפקודה - נקודות מתקדמות החלפת שמות קבצים (globing) לא מבוצעת עבור.single or double quoted strings - quotes back מופיעה - כאשר המחרוזת ב החלפת פקודות - shell מתייחס לתוצאת כאל מילה double quote ה בתוך אחת. 54 Masha Nikolski, CS Department, Technion 27