| ÄúµÄλÖãºÊ×Ò³ > Îĵµ > Shell > |
ÎÄÕ·ÖÀàÈÈÃÅÎÄÕ |
shell¾µä13ÎÊ´´½¨£º2005-10-26 00:49:45 ×÷ÕߣºUnlinux À´×Ô: http://www.Unlinux.com [תÌù]±È½Ï¾µä---Unix,linux shell Ê®Èý†–? <p></p><blockquote><pre>´úÂë:<hr> 1) žéºÎ½Ð×ö shell £¿ ÔÚ½é½B shell ÊÇÉõüN–|Î÷֮ǰ£¬²»·Á׌ÎÒ‚ƒÖØÐ™zҕʹÓÃÕßÅcëŠÄXϵ½yµÄêP‚S£º ˆD(FIXME) ÎÒ‚ƒÖªµÀëŠÄXµÄß×÷²»ÄÜëxé_Ó²ów£¬µ«Ê¹ÓÃÕß…sŸo·¨Ö±½ÓŒ¦Ó²ów×÷òŒ„Ó£¬ Ó²ówµÄòŒ„ÓÖ»ÄÜ͸ß^Ò»‚€·Qžé"×÷˜Iϵ½y(Operating System)"µÄÜ›ów?í¿Ø¹Ü£¬ ÊÂŒ?ÉÏ£¬ÎÒ‚ƒÃ¿ÌìËùÕ„µÄ linux £¬‡À¸ñ?íÕfÖ»ÊÇÒ»‚€×÷˜Iϵ½y£¬ÎÒ‚ƒ·QÖ®žé"ºËÐÄ(kernel)"¡£ È»¶ø£¬?ÄʹÓÃÕߵĽǶÈ?íÕf£¬Ê¹ÓÃÕßÒ²›]Þk·¨Ö±½Ó²Ù×÷ kernel £¬ ¶øÊÇ͸ß^ kernel µÄ"Í⚤"³Ìʽ£¬Ò²¾ÍÊÇËùÖ^µÄ shell £¬?íÅc kernel œÏͨ¡£ ß@Ò²ÕýÊÇ kernel ¸ú shell µÄÐÎÏñÃüÃûêP‚S¡£ÈçˆD£º ˆD(FIXME) ?ļ¼Ðg½Ç¶È?íÕf£¬shell ÊÇÒ»‚€Ê¹ÓÃÕßÅcϵ½yµÄ»¥„Ó½çÃæ(interface)£¬ Ö÷ÒªÊÇ׌ʹÓÃÕß͸ß^ÃüÁîÐÐ(command line)?íʹÓÃϵ½yÒÔÍê³É¹¤×÷¡£ Òò´Ë£¬shell µÄ×†ÎµÄ¶¨Áx¾ÍÊÇ---ÃüÁî½â×gÆ÷(Command Interpreter)£º * Œ¢Ê¹ÓÃÕßµÄÃüÁî·×g½oºËÐÄÌŽÀí£¬ * ͬ•r£¬Œ¢ºËÐÄÌŽÀí½Y¹û·×g½oʹÓÃÕß¡£ ÿ´Î®”ÎÒ‚ƒÍê³Éϵ½yµÇÈë(log in)£¬ÎÒ‚ƒ¾ÍÈ¡µÃÒ»‚€»¥„ÓģʽµÄ shell £¬Ò²·Qžé login shell »ò primary shell¡£ Èô?ÄÐгÌ(process)½Ç¶È?íÕf£¬ÎÒ‚ƒÔÚ shell ËùÏÂß_µÄÃüÁ¾ùÊÇ shell Ëù®aÉúµÄ×ÓÐг̡£ß@¬FÏñ£¬ÎÒ‚ƒ•º¿É·QÖ®žé fork ¡£ Èç¹ûÊLjÌÐÐÄ_±¾(shell script)µÄÔ’£¬Ä_±¾ÖеÄÃüÁî„tÊÇÓÉÁíÍâÒ»‚€·Ç»¥„ÓģʽµÄ×Ó shell (sub shell)?íˆÌÐеġ£ Ò²¾ÍÊÇ primary shell ®aÉú sub shell µÄÐг̣¬sub shell ÔÙ®aÉú script ÖÐËùÓÐÃüÁîµÄÐг̡£ (êPì¶Ðг̣¬ÎÒ‚ƒÈÕááÓЙC•þÔÙÑa³ä¡£) ß@Ñe£¬ÎÒ‚ƒ±ØíšÖªµÀ£ºkernel Åc shell ÊDz»Í¬µÄƒÉÌ×Ü›ów£¬¶øÇÒ¶¼ÊÇ¿ÉÒÔ±»Ìæ“QµÄ£º * ²»Í¬µÄ×÷˜Iϵ½yʹÓò»Í¬µÄ kernel £¬ * ¶øÔÚͬһ‚€ kernel Ö®ÉÏ£¬Ò²¿ÉʹÓò»Í¬µÄ shell ¡£ ÔÚ linux µÄîAÔOϵ½yÖУ¬Í¨³£¶¼¿ÉÒÔÕÒµ½ºÃŽ×·N²»Í¬µÄ shell £¬ÇÒͨ³£•þ±»ÁÐì¶ÈçÏ™n°¸Ñe£º /etc/shells ²»Í¬µÄ shell ÓÐÖø²»Í¬µÄ¹¦ÄÜ£¬ÇÒÒ²±Ë´Ë¸÷®?¡¢»òÕf"´óͬС®?"¡£ ³£ÒŠµÄ shell Ö÷Òª·ÖžéƒÉ´óÖ÷Á÷£º sh£º burne shell (sh) burne again shell (bash) csh£º c shell (csh) tc shell (tcsh) korn shell (ksh) (FIXME) ´ó²¿·ÝµÄ Linux ϵ½yµÄîAÔO shell ¶¼ÊÇ bash £¬ÆäÔÒò´óÖÂÈçσÉüc£º * ×ÔÓÉÜ›ów * ¹¦ÄÜ?Š´ó bash ÊÇ gnu project ×î³É¹¦µÄ®aÆ·Ö®Ò»£¬×ÔÍÆ³öÒÔ?íÉîÊÜ?V´ó Unix ÓÑôϲ?Û£¬ ÇÒÒ²Öð?u³Éžé²»ÉÙ½M¿—µÄϵ½y˜ËœÊ¡£ 2) shell prompt(PS1) Åc Carriage Return(CR) µÄêP‚S£¿ ®”Äã³É¹¦µÇä›ßMÒ»‚€ÎÄ×Ö½çÃæÖ®áᣬ´ó²¿·ÝÇéÐÎÏ£¬ Äã•þÔÚŸÉÄ»ÉÏ¿´µ½Ò»‚€²»”àéW qµÄ·½‰K»òµ×¾€(Ò•²»Í¬°æ±¾¶ø„e)£¬ ÎÒ‚ƒ·QÖ®žé*ß[˜Ë*(coursor)¡£ ß[˜ËµÄ×÷ÓþÍÊǸæÔVÄã½ÓÏÂ?íÄã?ÄæI±PÝ”ÈëµÄ°´æIËù²åÈëµÄλÖ㬠ÇÒÿݔÈçÒ»æIß[˜Ë±ãÏòÓÒß…ÒÆ„ÓÒ»‚€¸ñ×Ó£¬ÈôßBÀmÝ”ÈëÌ«¶àµÄÔ’£¬„t×Ô„Ó½ÓÔÚÏÂÒ»ÐÐÝ”Èë¡£ ¼ÙÈçÄã„‚Íê³ÉµÇä›ß€›]Ý”ÈëÈκΰ´æI֮ǰ£¬ÄãËù¿´µ½µÄß[˜ËËùÔÚλÖõÄͬһÐеÄ×óß…²¿·Ý£¬ ÎÒ‚ƒ·QÖ®žé*Ìáʾ·ûÌ–*(prompt)¡£ Ìáʾ·ûÌ–µÄ¸ñʽ»òÒò²»Í¬Ïµ½y°æ±¾¶ø¸÷Óв»Í¬£¬ÔÚ Linux ÉÏ£¬Ö»ÐèÁôÒâ×î½Ó½üß[˜ËµÄÒ»‚€¿ÉÒŠµÄÌáʾ·ûÌ–£¬Í¨³£ÊÇÈçσÉÕßÖ®Ò»£º $£º½oÒ»°ãʹÓÃÕߎ¤Ì–ʹÓà #£º½o root (¹ÜÀí†T)Ž¤Ì–Ê¹Óà ÊÂŒ?ÉÏ£¬shell prompt µÄÒâ˼ºÜº††Î£º * ÊÇ shell ¸æÔVʹÓÃÕߣºÄú¬FÔÚ¿ÉÒÔÝ”ÈëÃüÁîÐÐÁË¡£ ÎÒ‚ƒ¿ÉÒÔÕf£¬Ê¹ÓÃÕßÖ»ÓÐÔڵõ½ shell prompt ²ÅÄÜ´òÃüÁîÐУ¬ ¶ø cursor ÊÇָʾæI±PÔÚÃüÁîÐÐËùÝ”ÈëµÄλÖã¬Ê¹ÓÃÕßÿݔÈëÒ»‚€æI£¬cursor ¾ÍÍùááÒÆ„ÓÒ»¸ñ£¬ Ö±µ½Åöµ½ÃüÁîÐÐ×xßM CR(Carriage Return£¬ÓÉ Enter æI®aÉú)×Ö·ûžéÖ¹¡£ CR µÄÒâ˼ҲºÜº††Î£º * ÊÇʹÓÃÕ߸æÔV shell£ºÀÏÐÖÄã¿ÉÒÔˆÌÐÐÎÒµÄÃüÁîÐÐÁË¡£ ‡À¸ñ?íÕf£º * ËùÖ^µÄÃüÁîÐУ¬¾ÍÊÇÔÚ shell prompt Åc CR ×Ö·ûÖ®égËùÝ”ÈëµÄÎÄ×Ö¡£ (˼¿¼£ºžéºÎÎÒ‚ƒß@ÑeˆÔ³ÖʹÓà CR ×Ö·û¶ø²»Õf Enter æIÄØ£¿´ð°¸ÔÚááÃæµÄŒWÁ•Öнҕԡ£) ²»Í¬µÄÃüÁî¿É½ÓÊܵÄÃüÁîÐиñʽ»òÓв»Í¬£¬Ò»°ãÇé›rÏ£¬Ò»‚€˜ËœÊµÄÃüÁîÐиñʽžéÈçÏÂËùÁУº command-name options argument Èô?ļ¼Ðg¼š¹??í¿´£¬shell •þÒÀ“þ IFS(Internal Field Seperator) Œ¢ command line ËùÝ”ÈëµÄÎÄ×Ö½o²ð½âžé"×Ö¶Î"(word)¡£ È»ááÔÙᘌ¦ÌØÊâ×Ö·û(meta)ÏÈ×÷ÌŽÀí£¬×îááÔÙÖØ½MÕûÐÐ command line ¡£ (×¢Ò⣺Ո„Õ±ØÀí½âÉσɾäÔ’µÄÒâ˼£¬ÎÒ‚ƒÈÕááµÄŒWÁ•ÖЕþ³£»Øµ½ß@Ñe˼¿¼¡£) ÆäÖÐµÄ IFS ÊÇ shell îAÔOʹÓõęÚλ·Ö¸ô·ûÌ–£¬¿ÉÒÔÓÉÒ»‚€¼°¶à‚€Èçϰ´æI½M³É£º * ¿Õ°×æI(White Space) * ±í¸ñæI(Tab) * »ØÜ‡æI(Enter) ϵ½y¿É½ÓÊܵÄÃüÁîÃû·Q(command-name)¿ÉÒÔ?ÄÈçÏÂ;ޟ«@µÃ£º * Ã÷´_·ޟËùÖ¸¶¨µÄÍⲿÃüÁî * ÃüÁî„eÃû(alias) * ×Ô¶¨¹¦ÄÜ(function) * shell ƒÈ½¨ÃüÁî(built-in) * $PATH ֮ϵÄÍⲿÃüÁî ÿһ‚€ÃüÁîÐоù±ØÐ躬ÓÃÃüÁîÃû·Q£¬ß@ÊDz»ÄÜȱÉٵġ£ 3) „eÈË echo¡¢ÄãÒ² echo £¬Êdž– echo Öª¶àÉÙ£¿ ³Ð½ÓÉÏÒ»ÕÂËù½é½BµÄ command line £¬ß@ÑeÎÒ‚ƒÓà echo ß@‚€ÃüÁî¼ÓÒÔßMÒ»²½ÕfÃ÷¡£ œØÁ•---˜ËœÊµÄ command line °üº¬Èý‚€²¿¼þ£º * command_name option argument echo ÊÇÒ»‚€·Ç³£º††Î¡¢Ö±½ÓµÄ Linux ÃüÁ * Œ¢ argument ËͳöÖÁ˜ËœÊÝ”³ö(STDOUT)£¬Í¨³£¾ÍÊÇÔÚ±OÒ•Æ÷(monitor)ÉÏÝ”³ö¡£ (Ô]£ºstdout ÎÒ‚ƒÈÕááÓЙC•þÔÙ½âÕf£¬»ò¿ÉÏÈ…¢¿¼ÈçÏÂÓ‘Õ“£º <a href="http://www.chinaunix.net/forum/viewtopic.php?t=191375" target="_blank">http://www.chinaunix.net/forum/viewtopic.php?t=191375</a> ) žéÁ˸üºÃÀí½â£¬²»ÈçÏÈ׌ÎÒ‚ƒÏÈÅÜһϠecho ÃüÁîºÃÁË£º ´úÂë: $ echo $ Äã•þ°l¬FÖ»ÓÐÒ»‚€¿Õ°×ÐУ¬È»ááÓֻص½ shell prompt ÉÏÁË¡£ ß@ÊÇÒòžé echo ÔÚîAÔOÉÏ£¬ÔÚï@ʾÍê argument Ö®áᣬ߀•þËͳöÒ»‚€“QÐзûÌ–(new-line charactor)¡£ µ«ÊÇÉÏÃæµÄ command ?K›]ÈÎºÎµÄ argument £¬ÄǽY¹û¾Íֻʣһ‚€“QÐзûÌ–ÁË... ÈôÄãҪȡÏûß@‚€“QÐзûÌ–£¬¿ÉÀûÓà echo µÄ -n option £º ´úÂë: $ echo -n $ ²»·Á׌ÎÒ‚ƒ»Øµ½ command line µÄ¸ÅÄîÉÏ?íÓ‘Õ“ÉÏÀýµÄ echo ÃüÁîºÃÁË£º * command line Ö»ÓÐ command_name(echo) ¼° option(-n)£¬?K›]ÓÐÈκΠargument ¡£ ÒªÏë¿´¿´ echo µÄ argument £¬ÄÇ߀²»º††Î©u½ÓÏÂ?í£¬Äã¿ÉÔ‡Ô‡ÈçϵÄÝ”È룺 ´úÂë: $ echo first line first line $ echo -n first line first line $ ì¶Éσɂ€ echo ÃüÁîÖУ¬Äã•þ°l¬F argument µÄ²¿·Ýï@ʾÔÚÄãµÄŸÉÄ»£¬¶ø“QÐзûÌ–„tÒ• -n option µÄÓПo¶ø„e¡£ ºÜÃ÷ï@µÄ£¬µÚ¶þ‚€ echo ÓÉì¶“QÐзûÌ–±»È¡ÏûÁË£¬½ÓÏÂ?íµÄ shell prompt ¾Í½ÓÔÚÝ”³ö½Y¹ûͬһÐÐÁË... ^_^ ÊÂŒ?ÉÏ£¬echo ³ýÁË -n options Ö®Í⣬³£ÓÃßxí—߀ÓУº -e £º†¢Ó÷´Ð±¾€¿ØÖÆ×Ö·ûµÄÞD“Q(…¢¿¼Ï±í) -E£ºêPé]·´Ð±¾€¿ØÖÆ×Ö·ûµÄÞD“Q(îAÔOÈç´Ë) -n £ºÈ¡ÏûÐÐĩ֮“QÐзûÌ–(Åc -e ßxí—Ï嵀 c ×Ö·ûͬÒâ) êPì¶ echo ÃüÁîËùÖ§Ô®µÄ·´Ð±¾€¿ØÖÆ×Ö·ûÈçÏÂ±í£º a£ºALERT / BELL (?Äϵ½yÀ®°ÈËͳöâ?•) b£ºBACKSPACE £¬Ò²¾ÍÊÇÏò×ó„h³ýæI c£ºÈ¡ÏûÐÐĩ֮“QÐзûÌ– E£ºESCAPE£¬ÌøÃ“æI f£ºFORMFEED£¬“Qí“×Ö·û n£ºNEWLINE£¬“QÐÐ×Ö·û r£ºRETURN£¬»ØÜ‡æI t£ºTAB£¬±í¸ñÌøÎ»æI v£ºVERTICAL TAB£¬´¹Ö±±í¸ñÌøÎ»æI n£ºASCII °ËßMλ¾Ž´a(ÒÔ x é_ÊמéÊ®ÁùßMλ) £º·´Ð±¾€±¾Éí (±í¸ñÙYÁÏ?í×Ô O'Reilly ³ö°æÉçÖ® Learning the Bash Shell, 2nd Ed.) »òÔS£¬ÎÒ‚ƒ¿ÉÒÔ͸ß^Œ?Àý?íÁ˽â echo µÄßxí—¼°¿ØÖÆ×Ö·û£º ÀýÒ»£º ´úÂë: $ echo -e "atbtcndtetf" a b c d e f ÉÏÀýßÓà t ?í…^¸ô abc ߀ÓÐ def £¬¼°Óà n Œ¢ def “QÖÁÏÂÒ»ÐС£ Àý¶þ£º ´úÂë: $ echo -e "141 11142 11143 12144 11145 11146" a b c d e f ÅcÀýÒ»µÄ½Y¹ûÒ»˜Ó£¬Ö»ÊÇʹÓà ASCII °ËßMλ¾Ž´a¡£ ÀýÈý£º ´úÂë: $ echo -e "x61x09x62x09x63x0ax64x09x65x09x66" a b c d e f ÅcÀý¶þ²î²»¶à£¬Ö»ÊÇß@´Î“QÓà ASCII Ê®ÁùßMλ¾Ž´a¡£ ÀýËÄ£º ´úÂë: $ echo -ne "atbtcndtebfa" a b c d f $ Òòžé e ×ÖĸááÃæÊÇ„h³ýæI(b)£¬Òò´ËÝ”³ö½Y¹û¾Í›]ÓÐ e ÁË¡£ ÔÚ½YÊø•r µ½Ò»Â•â?‡»£¬ÄÇÊÇ a µÄ‚Ü×÷©u ÓÉì¶Í¬•rʹÓÃÁË -n ßxí—£¬Òò´Ë shell prompt ¾o½ÓÔÚµÚ¶þÐÐÖ®áá¡£ ÈôÄã²»Óà -n µÄÔ’£¬ÄÇÄãÔÚ a ááÔÙ¼Ó‚€ c £¬Ò²ÊÇͬ˜ÓµÄЧ¹û¡£ ÊÂŒ?ÉÏ£¬ÔÚÈÕááµÄ shell ²Ù×÷¼° shell script ÔOÓ‹ÉÏ£¬echo ÃüÁîÊÇ×î³£±»Ê¹ÓõÄÃüÁîÖ®Ò»¡£ ±È·½Õf£¬Óà echo ?í™z²é׃Á¿Öµ£º ´úÂë: $ A=B $ echo $A B $ echo $? 0 (Ô]£ºêPì¶×ƒÁ¿¸ÅÄÎÒ‚ƒÁôµ½ÏƒÉÕ²Ÿú´ó¼ÒÕfÃ÷¡£) ºÃÁË£¬¸ü¶àµÄêPì¶ command line µÄ¸ñʽ£¬ÒÔ¼° echo ÃüÁîµÄßxí—£¬ ¾ÍÕˆÄú×ÔÐжà¼Ó¾šÁ•¡¢ßÓÃÁË... 4) " "(ëpÒýÌ–) Åc ' '(†ÎÒýÌ–)²îÔÚÄÄ£¿ ߀Êǻص½ÎÒ‚ƒµÄ command line ?í°É... ½›ß^Ç°ÃæƒÉÕµČWÁ•£¬‘ªÔ“ºÜÇå³þ®”ÄãÔÚ shell prompt ááÃæÇôòæI±P¡¢Ö±µ½°´Ï Enter µÄ•rºò£¬ ÄãÝ”ÈëµÄÎÄ×Ö¾ÍÊÇ command line ÁË£¬È»áá shell ²Å•þÒÔÐг̵ķ½Ê½ˆÌÐÐÄãËù½»½oËüµÄÃüÁî¡£ µ«ÊÇ£¬ÄãÓÖ¿ÉÖªµÀ£ºÄãÔÚ command line Ý”ÈëµÄÿһ‚€ÎÄ×Ö£¬Œ¦ shell ?íÕf£¬ÊÇÓÐî?„eÖ®·ÖµÄÄØ£¿ º††Î¶øÑÔ(ÎÒ²»¸ÒÕfß@ÊǾ«´_µÄ¶¨×h£¬Ô]Ò»)£¬command line µÄÿһ‚€ charactor £¬·ÖžéÈçσɷN£º * literal£ºÒ²¾ÍÊÇÆÕͨ¼ƒÎÄ×Ö£¬Œ¦ shell ?íÕf›]ÌØÊ⹦ÄÜ¡£ * meta£ºŒ¦ shell ?íÕf£¬¾ßÓÐÌØ¶¨¹¦ÄܵÄÌØÊâ±£Áô×ÖÔª¡£ (Ô]Ò»£ºêPì¶ bash shell ÔÚÌŽÀí command line •rµÄí˜ÐòÕfÃ÷£¬ Õˆ…¢¿¼ O'Reilly ³ö°æÉçÖ® Learning the Bash Shell, 2nd Edition£¬µÚ 177 - 180 퓵ÄÕfÃ÷£¬ ÓÈÆäÊÇ 178 퓵ÄÁ÷³ÌˆD Figure 7-1 ... ) Literal ›]ÉõüNºÃÕ„µÄ£¬·²Åe abcd¡¢123456 ß@Щ"ÎÄ×Ö"¶¼ÊÇ literal ... (easy£¿) µ« meta …s³£Ê¹ÎÒ‚ƒÀ§»ó..... (confused?) ÊÂŒ?ÉÏ£¬Ç°ƒÉÕÂÎÒ‚ƒÔÚ command line ÖÐÒÑÅöµ½ƒÉ‚€™Cºõÿ´Î¶¼•þÅöµ½µÄ meta £º * IFS£ºÓÉ <space> »ò <tab> »ò <enter> ÈýÕßÖ®Ò»½M³É(ÎÒ‚ƒ³£Óà space )¡£ * CR£ºÓÉ <enter> ®aÉú¡£ IFS ÊÇÓÃ?í²ð½â command line µÄÿһ‚€Ô~(word)Óõģ¬Òòžé shell command line Êǰ´Ô~?íÌŽÀíµÄ¡£ ¶ø CR „tÊÇÓÃ?í½YÊø command line Óõģ¬ß@Ò²ÊÇžéºÎÎÒ‚ƒÇà <enter> ÃüÁî¾Í•þÅܵÄÔÒò¡£ ³ýÁË IFS Åc CR £¬³£ÓÃµÄ meta ߀ÓУº = £º ÔO¶¨×ƒÁ¿¡£ $ £º ×÷׃Á¿»òßËãÌæ“Q(Õˆ²»ÒªÅc shell prompt ¸ã»ìÁË)¡£ > £ºÖØŒ§Ïò stdout¡£ < £ºÖØŒ§Ïò stdin¡£ |£ºÃüÁî¹Ü¾€¡£ & £ºÖØŒ§Ïò file descriptor £¬»òŒ¢ÃüÁîÖÃì¶±³¾³ˆÌÐС£ ( )£ºŒ¢ÆäƒÈµÄÃüÁîÖÃì¶ nested subshell ˆÌÐУ¬»òÓÃì¶ßËã»òÃüÁîÌæ“Q¡£ { }£ºŒ¢ÆäƒÈµÄÃüÁîÖÃì¶ non-named function ÖЈÌÐУ¬»òÓÃÔÚ׃Á¿Ìæ“QµÄ½ç¶¨¹ ‡ú¡£ ; £ºÔÚǰһ‚€ÃüÁî½YÊø•r£¬¶øºöÂÔÆä·µ»ØÖµ£¬À^ÀmˆÌÐÐÏÂÒ»‚€ÃüÁî¡£ && £ºÔÚǰһ‚€ÃüÁî½YÊø•r£¬Èô·µ»ØÖµžé true£¬À^ÀmˆÌÐÐÏÂÒ»‚€ÃüÁî¡£ || £ºÔÚǰһ‚€ÃüÁî½YÊø•r£¬Èô·µ»ØÖµžé false£¬À^ÀmˆÌÐÐÏÂÒ»‚€ÃüÁî¡£ !£ºˆÌÐÐ history ÁбíÖеÄÃüÁî .... ¼ÙÈçÎÒ‚ƒÐèÒªÔÚ command line ÖÐŒ¢ß@Щ±£Áô×ÖÔªµÄ¹¦ÄÜêPé]µÄÔ’£¬¾ÍÐèÒª quoting ÌŽÀíÁË¡£ ÔÚ bash ÖУ¬³£ÓÃµÄ quoting ÓÐÈçÏÂÈý·N·½·¨£º * hard quote£º' ' (†ÎÒýÌ–)£¬·²ÔÚ hard quote ÖеÄËùÓÐ meta ¾ù±»êPé]¡£ * soft quote£º " " (ëpÒýÌ–)£¬ÔÚ soft quoe ÖÐ´ó²¿·Ý meta ¶¼•þ±»êPé]£¬µ«Ä³Ð©„t±£Áô(Èç $ )¡£(Ô]¶þ) * escape £º (·´Ð±¾€)£¬Ö»Óоo½ÓÔÚ escape (ÌøÃ“×Ö·û)Ö®ááµÄ†ÎÒ» meta ²Å±»êPé]¡£ ( Ô]¶þ£ºÔÚ soft quote Öб»»íÃâµÄ¾ßów meta Çå†Î£¬ÎÒ²»Íêȫ֪µÀ£¬ Óдý´ó¼ÒÑa³ä£¬»ò͸ß^Œ?×÷?í°l¬F¼°Àí½â¡£ ) ÏÂÃæµÄÀý×ÓŒ¢ÓÐÖúì¶ÎÒ‚ƒŒ¦ quoting µÄÁ˽⣺ ´úÂë: $ A=B C # ¿Õ°×æIδ±»êPµô£¬×÷žé IFS ÌŽÀí¡£ $ C: command not found. (FIXME) $ echo $A $ A="B C" # ¿Õ°×æIÒѱ»êPµô£¬ƒH×÷žé¿Õ°×æIÌŽÀí¡£ $ echo $A B C ÔÚµÚÒ»´ÎÔO¶¨ A ׃Á¿•r£¬ÓÉì¶¿Õ°×æI›]±»êPé]£¬command line Œ¢±»½â×xžé£º * A=B È»ááÅöµ½<IFS>£¬ÔÙˆÌÐÐ C ÃüÁî ÔÚµÚ¶þ´ÎÔO¶¨ A ׃Á¿•r£¬ÓÉì¶¿Õ°×æI±»ÖÃì¶ soft quote ÖУ¬Òò´Ë±»êPé]£¬²»ÔÙ×÷žé IFS £º * A=B<space>C ÊÂŒ?ÉÏ£¬¿Õ°×æIŸoÕ“ÔÚ soft quote ߀ÊÇÔÚ hard quote ÖУ¬¾ù•þ±»êPé]¡£Enter æIÒàÈ»£º ´úÂë: $ A='B > C > ' $ echo $A B C ÔÚÉÏÀýÖУ¬ÓÉì¶ <enter> ±»ÖÃì¶ hard quote ®”ÖУ¬Òò´Ë²»ÔÙ×÷žé CR ×Ö·û?íÌŽÀí¡£ ß@ÑeµÄ <enter> †Î¼ƒÖ»ÊÇÒ»‚€”àÐзûÌ–(new-line)¶øÒÑ£¬ÓÉì¶ command line ?K›]µÃµ½ CR ×Ö·û£¬ Òò´ËßMÈëµÚ¶þ‚€ shell prompt (PS2£¬ÒÔ > ·ûÌ–±íʾ)£¬command line ?K²»•þ½YÊø£¬ Ö±µ½µÚÈýÐУ¬ÎÒ‚ƒÝ”ÈëµÄ <enter> ?K²»ÔÚ hard quote ÑeÃæ£¬Òò´Ë?K›]±»êPé]£¬ ´Ë•r£¬command line Åöµ½ CR ×Ö·û£¬ì¶ÊǽYÊø¡¢½»½o shell ?íÌŽÀí¡£ ÉÏÀýµÄ <enter> ÒªÊDZ»ÖÃì¶ soft quote ÖеÄÔ’£¬Ò²•þͬ˜Ó±»êPé]£¬Óà escape Òà¿É£º ´úÂë: $ A=B > C > $ echo $A B C ÉÏÀýÖУ¬µÚÒ»‚€ <enter> ¸úµÚ¶þ‚€ <enter> ¾ù±» escape ×Ö·ûêPé]ÁË£¬Òò´ËÒ²²»×÷žé CR ?íÌŽÀí£¬ µ«µÚÈý‚€ <enter> ÓÉì¶›]±»ÌøÃ“£¬Òò´Ë×÷žé CR ½YÊø command line ¡£ ÖÁì¶ soft quote ¸ú hard quote µÄ²»Í¬£¬Ö÷ÒªÊÇŒ¦ì¶Ä³Ð© meta µÄêPé]Åc·ñ£¬ÒÔ $ ?í×÷ÕfÃ÷£º ´úÂë: $ A=B C $ echo "$A" B C $ echo '$A' $A ÔÚµÚÒ»‚€ echo ÃüÁîÐÐÖУ¬$ ±»ÖÃì¶ soft quote ÖУ¬Œ¢²»±»êPé]£¬Òò´ËÀ^ÀmÌŽÀí׃Á¿Ìæ“Q£¬ Òò´Ë echo Œ¢ A µÄ׃Á¿ÖµÝ”³öµ½ŸÉÄ»£¬Ò²¾ÍµÃµ½ "B C" µÄ½Y¹û¡£ ÔÚµÚ¶þ‚€ echo ÃüÁîÐÐÖУ¬$ ±»ÖÃì¶ hard quote ÖУ¬„t±»êPé]£¬Òò´Ë $ Ö»ÊÇÒ»‚€ $ ·ûÌ–£¬ ?K²»•þÓÃ?í×÷׃Á¿Ìæ“QÌŽÀí£¬Òò´Ë½Y¹ûÊÇ $ ·ûÌ–ááÃæ½ÓÒ»‚€ A ×Öĸ£º$A ¡£ -------------------------------------- ¾šÁ•Åc˼¿¼£ºÈçϽY¹ûžéºÎ²»Í¬£¿ ´úÂë: $ A=B C $ echo '"$A"' # ×îÍâÃæµÄÊdžÎÒýÌ– "$A" $ echo "'$A'" # ×îÍâÃæµÄÊÇëpÒýÌ– 'B C' (Ìáʾ£º†ÎÒýÌ–¼°ëpÒýÌ–£¬ÔÚ quoting Öоù±»êP?#93;ÁË¡£) -------------------------------------- ÔÚ CU µÄ shell °æÑe£¬ÎÒ°l¬FÓкܶà³õŒWÕߵĆ–î}£¬¶¼Åc quoting Àí½âµÄÓÐêP¡£ ±È·½Õf£¬ÈôÎÒ‚ƒÔÚ awk »ò sed µÄÃüÁî…¢”µÖÐÕ{ÓÃ֮ǰÔO¶¨µÄһЩ׃Á¿•r£¬³£•þ†–¼°žéºÎ²»ÄܵĆ–î}¡£ Òª½â›Qß@Щ†–î}£¬êPæIüc¾ÍÊÇ£º * …^·Ö³ö shell meta Åc command meta Ç°ÃæÎÒ‚ƒÌáµ½µÄÄÇЩ meta £¬¶¼ÊÇÔÚ command line ÖÐÓÐÌØÊâÓÃ;µÄ£¬ ±È·½Õf { } ÊÇŒ¢ÆäƒÈһϵÁÐ command line ÖÃì¶²»¾ßÃûµÄº¯Ê½ÖЈÌÐÐ(¿Éº††ÎÒ•žé command block )£¬ µ«ÊÇ£¬awk …sÐèÒªÓà { } ?í…^·Ö³ö awk µÄÃüÁî…^¶Î(BEGIN, MAIN, END)¡£ ÈôÄãÔÚ command line ÖÐÈç´ËÝ”È룺 ´úÂë: $ awk {print $0} 1.txt ÓÉì¶ { } ÔÚ shell ÖÐ?K›]êPé]£¬ÄÇ shell ¾ÍŒ¢ {print $0} Ò•žé command block £¬ µ«Í¬•rÓÖ›]ÓÐ" ; "·ûÌ–×÷ÃüÁî…^¸ô£¬Òò´Ë¾Í³ö¬F awk µÄÕZ·¨åeÕ`½Y¹û¡£ Òª½â›QÖ®£¬¿ÉÓà hard quote £º ´úÂë: $ awk '{print $0}' 1.txt ÉÏÃæµÄ hard quote ‘ªºÃÀí½â£¬¾ÍÊÇŒ¢Ô±¾µÄ {¡¢<space>¡¢$(Ô]Èý)¡¢} ß@Ž×‚€ shell meta êPé]£¬ ±ÜÃâµôÔÚ shell ÖÐÔ⵽̎Àí£¬¶øÍêÕûµÄ³Éžé awk …¢”µÖÐµÄ command meta ¡£ ( Ô]Èý£º¶øÆäÖÐµÄ $0 ÊÇ awk ƒÈ½¨µÄ field number £¬¶ø·Ç awk µÄ׃Á¿£¬ awk ×ÔÉíµÄ׃Á¿ŸoÐèʹÓà $ ¡£) ÒªÊÇÀí½âÁË hard quote µÄ¹¦ÄÜ£¬ÔÙ?íÀí½â soft quote Åc escape ¾Í²»ëy£º ´úÂë: awk "{print $0}" 1.txt awk {print $0} 1.txt È»¶ø£¬ÈôÄãÒª¸Ä׃ awk µÄ $0 µÄ 0 ÖµÊÇ?ÄÁíÒ»‚€ shell ׃Á¿×xßMÄØ£¿ ±È·½Õf£ºÒÑÓÐ׃Á¿ $A µÄÖµÊÇ 0 £¬ÄÇÈçºÎÔÚ command line Öнâ›Q awk µÄ $$A ÄØ£¿ Äã¿ÉÒÔºÜÖ±½Ó·ñ¶¨µô hard quoe µÄ·½°¸£º ´úÂë: $ awk '{print $$A}' 1.txt ÄÇÊÇÒòžé $A µÄ $ ÔÚ hard quote ÖÐÊDz»ÄÜÌæ“Q׃Á¿µÄ¡£ ”Ã÷µÄ×xÕß(ÈçÄã!)£¬½›ß^±¾ÕÂŒWÁ•£¬ÎÒÏ룬‘ªÔ“¿ÉÒÔ½âጞéºÎÎÒ‚ƒ¿ÉÒÔʹÓÃÈçϲÙ×÷Á˰ɣº ´úÂë: A=0 awk "{print $$A}" 1.txt awk {print $$A} 1.txt awk '{print $'$A'}' 1.txt awk '{print $'"$A"'}' 1.txt # ×¢£º"$A" °üÔÚ soft quote ÖÐ »òÔS£¬ÄãÄÜÅe³ö¸ü¶àµÄ·½°¸ÄØ.... ^_^ 5) var=value£¿export ǰáá²îÔÚÄÄ£¿ ß@´Î׌ÎÒ‚ƒ•º•r?Gé_ command line £¬ÏÈ?íÁ˽âһϠbash ׃Á¿(variable)°É... ËùÖ^µÄ׃Á¿£¬¾ÍÊǾÍÊÇÀûÓÃÒ»‚€Ìض¨µÄ"Ãû·Q"(name)?í´æÈ¡Ò»¶Î¿ÉÒÔ׃»¯µÄ"Öµ"(value)¡£ *ÔO¶¨(set)* ÔÚ bash ÖУ¬Äã¿ÉÒÔÓà "=" ?íÔO¶¨»òÖØÐ¶¨Áx׃Á¿µÄƒÈÈÝ£º name=value ÔÚÔO¶¨×ƒÁ¿µÄ•rºî£¬µÃ×ñÊØÈçÏÂÒŽ„t£º * µÈÌ–×óÓÒƒÉß…²»ÄÜʹÓÃ…^¸ô·ûÌ–(IFS)£¬Ò²‘ª±ÜÃâʹÓà shell µÄ±£Áô×ÖÔª(meta charactor)¡£ * ׃Á¿Ãû·Q²»ÄÜʹÓà $ ·ûÌ–¡£ * ׃Á¿Ãû·QµÄµÚÒ»‚€×Öĸ²»ÄÜÊÇ”µ×Ö(number)¡£ * ׃Á¿Ãû·QéL¶È²»¿É³¬ß^ 256 ‚€×Öĸ¡£ * ׃Á¿Ãû·Q¼°×ƒÁ¿ÖµÖ®´óСŒ‘ÊÇÓÐ…^„eµÄ(case sensitive)¡£ ÈçÏÂÊÇһЩ׃Á¿ÔO¶¨•r³£ÒеÄåeÕ`£º A= B £º²»ÄÜÓÐ IFS 1A=B £º²»ÄÜÒÔ”µ×Öé_î^ $A=B £ºÃû·Q²»ÄÜÓÐ $ a=B £ºß@¸ú a=b ÊDz»Í¬µÄ ÈçÏ„tÊÇ¿ÉÒÔ½ÓÊܵÄÔO¶¨£º A=" B" £ºIFS ±»êPé]ÁË (Õˆ…¢¿¼Ç°ÃæµÄ quoting Õ¹?) A1=B £º?K·ÇÒÔ”µ×Öé_î^ A=$B £º$ ¿ÉÓÃÔÚ׃Á¿ÖµƒÈ This_Is_A_Long_Name=b £º¿ÉÓà _ ßB½ÓÝ^éLµÄÃû·Q»òÖµ£¬ÇÒ´óСŒ‘ÓЄe¡£ *׃Á¿Ìæ“Q(substitution)* Shell Ö®ËùÒÔ?д󣬯äÖеÄÒ»‚€ÒòËØÊÇËü¿ÉÒÔÔÚÃüÁîÐÐÖÐŒ¦×ƒÁ¿×÷Ìæ“Q(substitution)ÌŽÀí¡£ ÔÚÃüÁîÐÐÖÐʹÓÃÕß¿ÉÒÔʹÓà $ ·ûÌ–¼ÓÉÏ׃Á¿Ãû·Q(³ýÁËÔÚÓà = Ì–¶¨Áx׃Á¿Ãû·QÖ®Íâ)£¬ Œ¢×ƒÁ¿Öµ½oÌæ“Q³ö?í£¬È»ááÔÙÖØÐ½M½¨ÃüÁîÐС£ ±È·½£º ´úÂë: $ A=ls $ B=la $ C=/tmp $ $A -$B $C (×¢Ò⣺ÒÔÉÏÃüÁîÐеĵÚÒ»‚€ $ ÊÇ shell prompt £¬?K²»ÔÚÃüÁîÐÐÖ®ƒÈ¡£) ±ØÐè?ŠÕ{µÄÊÇ£¬ÎÒ‚ƒËùÌáµÄ׃Á¿Ìæ“Q£¬Ö»°lÉúÔÚ command line ÉÏÃæ¡£(Êǵģ¬×ŒÎÒ‚ƒÔٻص½ command line °É©u) ×мš·ÖÎö×îááÄÇÐÐ command line £¬²»ëy°l¬FÔÚ±»ˆÌÐÐ֮ǰ(ÔÚÝ”Èë CR ×Ö·û֮ǰ)£¬ $ ·ûÌ–•þŒ¦Ã¿Ò»‚€×ƒÁ¿×÷Ìæ“QÌŽÀí(Œ¢×ƒÁ¿ÖµÌæ“Q³ö?íÔÙÖØ½MÃüÁîÐÐ)£¬×îáá•þµÃ³öÈçÏÂÃüÁîÐУº ´úÂë: ls -la /tmp ߀ӛµÃµÚ¶þÕÂÎÒÕˆ´ó¼Ò"„Õ±ØÀí½â"µÄÄǃɾä†á£¿ÈôÄãÍüÁË£¬ÄÇÎÒß@ÑeÔÙÖØÙNÒ»±é£º ÒýÓÃ: Èô?ļ¼Ðg¼š¹??í¿´£¬shell •þÒÀ“þ IFS(Internal Field Seperator) Œ¢ command line ËùÝ”ÈëµÄÎÄ×Ö½o²ð½âžé"×Ö¶Î"(word)¡£ È»ááÔÙᘌ¦ÌØÊâ×Ö·û(meta)ÏÈ×÷ÌŽÀí£¬×îááÔÙÖØ½MÕûÐÐ command line ¡£ ß@ÑeµÄ $ ¾ÍÊÇ command line ÖÐ×î½›µäµÄ meta Ö®Ò»ÁË£¬¾ÍÊÇ×÷׃Á¿Ìæ“QµÄ©u ÔÚÈÕ³£µÄ shell ²Ù×÷ÖУ¬ÎÒ‚ƒ³£•þʹÓà echo ÃüÁî?í²é¿´Ìض¨×ƒÁ¿µÄÖµ£¬ÀýÈ磺 ´úÂë: $ echo $A -$B $C ÎÒ‚ƒÒÑŒWß^£¬ echo ÃüÁîÖ»†Î¼ƒŒ¢Æä argument ËÍÖÁ"˜ËœÊÝ”³ö"(STDOUT£¬Í¨³£ÊÇÎÒ‚ƒµÄŸÉÄ»)¡£ ËùÒÔÉÏÃæµÄÃüÁî•þÔÚŸÉÄ»Éϵõ½ÈçϽY¹û£º ´úÂë: ls -la /tmp ß@ÊÇÓÉì¶ echo ÃüÁîÔÚˆÌÐЕr£¬•þÏÈŒ¢ $A(ls)¡¢$B(la)¡¢¸ú $C(/tmp) ½oÌæ“Q³ö?íµÄ½Y¹û¡£ ÀûÓà shell Œ¦×ƒÁ¿µÄÌæ“QÌŽÀíÄÜÁ¦£¬ÎÒ‚ƒÔÚÔO¶¨×ƒÁ¿•r¾Í¸üžéì`»îÁË£º A=B B=$A ß@˜Ó£¬B µÄ׃Á¿Öµ¾Í¿ÉÀ^³Ð A ׃Á¿"®”•r"µÄ׃Á¿ÖµÁË¡£ ²»ß^£¬²»ÒªÒÔ"”µŒWÁ_Ý‹"?íÌ×ÓÃ׃Á¿µÄÔO¶¨£¬±È·½Õf£º A=B B=C ß@˜Ó?K²»•þ׌ A µÄ׃Á¿Öµ×ƒ³É C ¡£ÔÙÈ磺 A=B B=$A A=C ͬ˜ÓÒ²²»•þ׌ B µÄÖµ“Q³É C ¡£ ÉÏÃæÊdž샶¨ÁxÁ˃ɂ€²»Í¬Ãû·QµÄ׃Á¿£ºA Åc B £¬Ëü‚ƒµÄÖµ·Ö„eÊÇ B Åc C ¡£ Èô׃Á¿±»ÖØ?Ͷ¨ÁxµÄÔ’£¬„tÔÓÐÅfÖµŒ¢±»ÐÂÖµËùÈ¡´ú¡£(ß@²»ÕýÊÇ"¿É׃µÄÁ¿"†á£¿ ^_^) ®”ÎÒ‚ƒÔÚÔO¶¨×ƒÁ¿µÄ•rºî£¬ÕˆÓ›Öøß@üc£º * ÓÃÒ»‚€Ãû·Qƒ¦´æÒ»‚€”µÖµ ƒH´Ë¶øÒÑ¡£ ´ËÍ⣬ÎÒ‚ƒÒ²¿ÉÀûÓÃÃüÁîÐеÄ׃Á¿Ìæ“QÄÜÁ¦?í"”U³ä"(append)׃Á¿Öµ£º A=B:C:D A=$A:E ß@˜Ó£¬µÚÒ»ÐÐÎÒ‚ƒÔO¶¨ A µÄÖµžé "B:C:D"£¬È»áᣬµÚ¶þÐÐÔÙŒ¢Öµ”U³äžé "A:B:C:E" ¡£ ÉÏÃæµÄ”U³ä¹ Àý£¬ÎÒ‚ƒÊ¹ÓÃ…^¸ô·ûÌ–( : )?íß_µ½”U³äÄ¿µÄ£¬ ÒªÊÇ›]ÓÐ…^¸ô·ûÌ–µÄÔ’£¬ÈçÏÂÊÇÓІ–î}µÄ£º A=BCD A=$AE ÒòžéµÚ¶þ´ÎÊÇŒ¢ A µÄÖµÀ^³Ð $AE µÄÌá“Q½Y¹û£¬¶ø·Ç $A ÔÙ¼Ó E ©u Òª½â›Q´Ë†–î}£¬ÎÒ‚ƒ¿ÉÓøü‡ÀÖ”µÄÌæ“QÌŽÀí£º A=BCD A=${A}E ÉÏÀýÖУ¬ÎÒ‚ƒÊ¹Óà {} Œ¢×ƒÁ¿Ãû·QµÄ¹ ‡ú½oÃ÷´_¶¨Áx³ö?í£¬ Èç´ËÒ»?í£¬ÎÒ‚ƒ¾Í¿ÉÒÔŒ¢ A µÄ׃Á¿Öµ?Ä BCD ½o”U³äžé BCDE ¡£ (Ìáʾ£ºêPì¶ ${name} ÊÂŒ?ÉÏ߀¿É×öµ½¸ü¶àµÄ׃Á¿ÌŽÀíÄÜÁ¦£¬ß@Щ¾ùŒÙì¶±ÈÝ^ßMëAµÄ׃Á¿ÌŽÀí£¬ ¬FëA¶Î•º•r²»½é½BÁË£¬Õˆ´ó¼Ò×ÔÐÐ…¢¿¼ÙYÁÏ¡£Èç CU µÄÙN×Ó£º <a href="http://www.chinaunix.net/forum/viewtopic.php?t=201843" target="_blank">http://www.chinaunix.net/forum/viewtopic.php?t=201843</a> ) * export * ‡À¸ñ?íÕf£¬ÎÒ‚ƒÔÚ®”ǰ shell ÖÐËù¶¨ÁxµÄ׃Á¿£¬¾ùŒÙì¶"±¾µØ×ƒÁ¿"(local variable)£¬ Ö»Óн›ß^ export ÃüÁîµÄ"Ý”³ö"ÌŽÀí£¬²ÅÄܳɞéh¾³×ƒÁ¿(environment variable)£º ´úÂë: $ A=B $ export A »ò£º ´úÂë: $ export A=B ½›ß^ export Ý”³öÌŽÀíÖ®áᣬ׃Á¿ A ¾ÍÄܳɞéÒ»‚€h¾³×ƒÁ¿¹©ÆäááµÄÃüÁîʹÓᣠÔÚʹÓà export µÄ•rºî£¬Õˆ„eÍüÓ› shell ÔÚÃüÁîÐÐŒ¦×ƒÁ¿µÄ"Ìæ“Q"(substitution)ÌŽÀí£¬ ±È·½Õf£º ´úÂë: $ A=B $ B=C $ export $A ÉÏÃæµÄÃüÁî?KδŒ¢ A Ý”³öžéh¾³×ƒÁ¿£¬¶øÊÇŒ¢ B ×÷Ý”³ö£¬ ß@ÊÇÒòžéÔÚß@‚€ÃüÁîÐÐÖУ¬$A •þÊ×Ïȱ»Ìá“Q³ö B È»ááÔÙ"Èû»Ø"×÷ export µÄ…¢”µ¡£ ÒªÀí½âß@‚€ export £¬ÊÂŒ?ÉÏÐèÒª?Ä process µÄ½Ç¶È?íÀí½â²ÅÄÜ͸?Ø¡£ ÎÒŒ¢ì¶ÏÂÒ»Õžé´ó¼ÒÕfÃ÷ process µÄÓ^Ä¾´ÕˆÁôÒâ¡£ *È¡Ïû׃Á¿* ҪȡÏûÒ»‚€×ƒÁ¿£¬ÔÚ bash ÖпÉʹÓà unset ÃüÁî?íÌŽÀí£º ´úÂë: unset A Åc export Ò»˜Ó£¬unset ÃüÁîÐÐҲͬ˜Ó•þ×÷׃Á¿Ìæ“Q(ß@ÆäŒ?¾ÍÊÇ shell µÄ¹¦ÄÜÖ®Ò»)£¬ Òò´Ë£º ´úÂë: $ A=B $ B=C $ unset $A ÊÂŒ?ÉÏËùÈ¡ÏûµÄ׃Á¿ÊÇ B ¶ø²»ÊÇ A ¡£ ´ËÍ⣬׃Á¿Ò»µ©½›ß^ unset È¡ÏûÖ®áᣬÆä½Y¹ûÊÇŒ¢Õû‚€×ƒÁ¿Äõô£¬¶ø²»ƒHÊÇÈ¡ÏûÆä׃Á¿Öµ¡£ ÈçσÉÐÐÆäŒ?ÊǺܲ»Ò»˜ÓµÄ£º ´úÂë: $ A= $ unset A µÚÒ»ÐÐÖ»ÊÇŒ¢×ƒÁ¿ A ÔO¶¨žé"¿ÕÖµ"(null value)£¬µ«µÚ¶þÐЄt׌׃Á¿ A ²»ÔÚ´æÔÚ¡£ ëmÈ»ÓÃÑÛ¾¦?í¿´£¬ß@ƒÉ·N׃Á¿ î‘BÔÚÈçÏÂÃüÁî½Y¹ûÖж¼ÊÇÒ»˜ÓµÄ£º ´úÂë: $ A= $ echo $A $ unset A $ echo $A ÕˆŒW†T„Õ±ØÄÜ×R„e null value Åc unset µÄ±¾Ù|…^„e£¬ß@ÔÚһЩßMëAµÄ׃Á¿ÌŽÀíÉÏÊǺ܇À¸ñµÄ¡£ ±È·½Õf£º ´úÂë: $ str= # ÔOžé null $ var=${str=expr} # ¶¨Áx var $ echo $var $ echo $str $ unset str # È¡Ïû $ var=${str=expr} # ¶¨Áx var $ echo $var expr $ echo $str expr ”Ã÷µÄ×xÕß(yes, you!)£¬ÉÔ¼Ó˼¿¼µÄÔ’£¬ ‘ªÔ“²»ëy°l¬FžéºÎͬ˜ÓµÄ var=${str=expr} ÔÚ null Åc unset ֮ϵIJ»Í¬°É£¿ ÈôÄã¿´²»³ö?í£¬ÄÇ¿ÉÄÜÊÇÈçÏÂÔÒòÖ®Ò»£º a. ÄãÌ«±¿ÁË b. ²»Á˽â var=${str=expr} ß@‚€ßMëAÌŽÀí c. Œ¦±¾ÆªÕfÃ÷߀›]?íµÃ¼°Ïû»¯ÎüÊÕ e. ÎÒÖvµÃ²»ºÃ ²»Öª£¬ÄãßxÄÄ‚€ÄØ£¿.... ^_^ 6) exec ¸ú source ²îÔÚÄÄ£¿ ß@´ÎÏÈ׌ÎÒ‚ƒ?Ä CU Shell °æµÄÒ»‚€Œ?ÀýÙN×Ó?íÕ„Æð°É£º ( <a href="http://www.chinaunix.net/forum/viewtopic.php?t=194191" target="_blank">http://www.chinaunix.net/forum/viewtopic.php?t=194191</a> ) ÀýÖеÄÌᆖÊÇ£º ÒýÓÃ: cd /etc/aa/bb/cc¿ÉÒÔˆÌÐÐ µ«ÊǰÑß@—lÃüÁÈëshell•rshell²»ˆÌÐУ¡ ß@ÊÇʲôÔÒòѽ£¡ ÎÒ®”•rÈçºÎ»Ø´ð•º•r„eÈ¥É£¬ÏÈ׌ÎÒ‚ƒÁ˽âÒ»ÏÂÐгÌ(process)µÄÓ^ÄîºÃÁË¡£ Ê×ÏÈ£¬ÎÒ‚ƒËùˆÌÐеÄÈκγÌʽ£¬¶¼ÊÇÓɸ¸ÐгÌ(parent process)Ëù®aÉú³ö?íµÄÒ»‚€×ÓÐгÌ(child process)£¬ ×ÓÐгÌÔÚ½YÊøáᣬŒ¢·µ»Øµ½¸¸ÐгÌÈ¥¡£´ËÒ»¬FÏñÔÚ Linux ϵ½yÖб»·Qžé fork ¡£ (žéºÎÒª³Ìžé fork ÄØ£¿àÅ£¬®‹Ò»ÏˆD»òÔS±ÈÝ^ºÃÀí½â... ^_^ ) ®”×ÓÐг̱»®aÉúµÄ•rºò£¬Œ¢•þ?ĸ¸ÐгÌÄÇÑe«@µÃÒ»¶¨µÄÙYÔ´·ÖÅä¡¢¼°(¸üÖØÒªµÄÊÇ)À^³Ð¸¸Ðг̵Äh¾³©u ׌ÎÒ‚ƒ»Øµ½ÉÏÒ»ÕÂËùÕ„µ½µÄ"h¾³×ƒÁ¿"°É£º * ËùÖ^h¾³×ƒÁ¿ÆäŒ?¾ÍÊÇÄÇЩ•þ‚÷½o×ÓÐг̵Ä׃Á¿¡£ º††Î¶øÑÔ£¬"ßz‚÷ÐÔ"¾ÍÊÇ…^·Ö±¾µØ×ƒÁ¿Åch¾³×ƒÁ¿µÄ›Q¶¨ÐÔÖ¸˜Ë¡£ È»¶ø£¬?Äßz‚÷µÄ½Ç¶È?í¿´£¬ÎÒ‚ƒÒ²²»ëy°l¬Fh¾³×ƒÁ¿µÄÁíÒ»‚€ÖØÒªÌØá磺 * h¾³×ƒÁ¿Ö»ÄÜ?ĸ¸Ðг̵½×ÓÐг̆ÎÏòÀ^³Ð¡£“Q¾äÔ’Õf£ºÔÚ×ÓÐгÌÖеÄh¾³ÈçºÎ׃¸ü£¬¾ù²»•þӰ푸¸Ðг̵Äh¾³¡£ ½ÓÏÂ?í£¬ÔÙ׌ÎÒ‚ƒÁ˽âÒ»ÏÂÃüÁîÄ_±¾(shell script)µÄ¸ÅÄî¡£ ËùÖ^µÄ shell script ÖvÆð?íºÜº††Î£¬¾ÍÊÇŒ¢ÄãÆ½•rÔÚ shell prompt ááËùÝ”ÈëµÄ¶àÐÐ command line ÒÀÐòŒ‘ÈëÒ»‚€ÎļþÈ¥¶øÒÑ¡£ ÆäÖÐÔÙ¼ÓÉÏһЩ—l¼þÅДࡢ»¥„Ó½çÃæ¡¢…¢”µßÓᢺ¯”µÕ{Óᢵȵȼ¼ÇÉ£¬µÃÒÔ׌ script ¸ü¼Ó"”Ã÷"µÄˆÌÐУ¬ µ«ÈôƲé_ß@Щ¼¼Çɲ»Õ„£¬ÎÒ‚ƒÕæµÄ¿ÉÒÔº††ÎµÄ¿´³É script Ö»²»ß^ÒÀ´ÎˆÌÐÐîAÏÈŒ‘ºÃµÄÃüÁîÐжøÒÑ¡£ ÔÙ½YºÏÒÔÉσɂ€¸ÅÄî(process + script)£¬ÄÇ‘ªÔ“¾Í²»ëyÀí½âÈçÏÂß@¾äÔ’µÄÒâ˼ÁË£º * Õý³£?íÕf£¬®”ÎÒ‚ƒˆÌÐÐÒ»‚€ shell script •r£¬ÆäŒ?ÊÇÏÈ®aÉúÒ»‚€ sub-shell µÄ×ÓÐг̣¬È»áá sub-shell ÔÙÈ¥®aÉúÃüÁîÐеÄ×ÓÐг̡£ È»„t£¬ÄÇ׌ÎÒ‚ƒ»Øµ½±¾ÕÂé_ʼ•rËùÌáµ½µÄÀý×ÓÔÙ?ÄÐÂ˼¿¼£º ÒýÓÃ: cd /etc/aa/bb/cc¿ÉÒÔˆÌÐÐ µ«ÊǰÑß@—lÃüÁÈëshell•rshell²»ˆÌÐУ¡ ß@ÊÇʲôÔÒòѽ£¡ ÎÒ®”•rµÄ´ð°¸ÊÇß@˜ÓµÄ£º ÒýÓÃ: Òòžé£¬Ò»°ãÎÒ‚ƒÅÜµÄ shell script ÊÇÓà subshell È¥ˆÌÐеġ£ ?Ä process µÄÓ^Äî?í¿´£¬ÊÇ parent process ®aÉúÒ»‚€ child process È¥ˆÌÐУ¬ ®” child ½YÊøáᣬ•þ·µ»Ø parent £¬µ« parent µÄh¾³ÊDz»•þÒò child µÄ¸Ä׃¶ø¸Ä׃µÄ¡£ ËùÖ^µÄh¾³Ôª”µºÜ¶à£¬·²Åe effective id, variable, workding dir µÈµÈ... ÆäÖÐµÄ workding dir ($PWD) ÕýÊǘÇÖ÷µÄÒɆ–ËùÔÚ£º ®”Óà subshell ?íÅÜ script µÄÔ’£¬sub shell µÄ $PWD •þÒòžé cd ¶ø×ƒ¸ü£¬ µ«®”·µ»Ø primary shell •r£¬$PWD ÊDz»•þ׃¸üµÄ¡£ Ä܉òÁ˽↖î}µÄÔÒò¼°ÆäÔÀíÊǺܺõ쬵«ÊÇ£¿ÈçºÎ½â›Q†–î}¿ÖÅÂÊÇÎÒ‚ƒ¸ü¸ÐÅdȤµÄ©uÊǰɣ¿^_^ ÄǺ㬽ÓÏÂ?í£¬ÔÙ׌ÎÒ‚ƒÁ˽âһϠsource ÃüÁîºÃÁË¡£ ®”ÄãÓÐÁË fork µÄ¸ÅÄîÖ®áᣬҪÀí½â source ¾Í²»ëy£º * ËùÖ^ source ¾ÍÊÇ׌ script ÔÚ®”ǰ shell ƒÈˆÌÐС¢¶ø²»ÊÇ®aÉúÒ»‚€ sub-shell ?íˆÌÐС£ ÓÉì¶ËùÓЈÌÐнY¹û¾ùì¶®”ǰ shell ƒÈÍê³É£¬Èô script µÄh¾³ÓÐËù¸Ä׃£¬®”ȻҲ•þ¸Ä׃®”ǰh¾³ÁË©u Òò´Ë£¬Ö»ÒªÎÒ‚ƒÒªŒ¢Ô±¾†ÎªšÝ”ÈëµÄ script ÃüÁîÐÐ׃³É source ÃüÁîµÄ…¢”µ£¬¾Í¿ÉÝpÒ×½â›QǰÀýÌáµ½µÄ†–î}ÁË¡£ ±È·½Õf£¬Ô±¾ÎÒ‚ƒÊÇÈç´ËˆÌÐÐ script µÄ£º ´úÂë: ./my.script ¬FÔڸijÉß@˜Ó¼´¿É£º ´úÂë: source ./my.script »ò£º . ./my.script Õfµ½ß@Ñe£¬ÎÒÏ룬¸÷λÓÐÅdȤ¿´¿´ /etc µ×ÏÂµÄ±Š¶àÔO¶¨Îļþ£¬ ‘ªÔ“²»ëyÀí½âËü‚ƒ±»¶¨×háᣬÈçºÎ׌ÆäËû script ×xÈ¡?KÀ^³ÐÁ˰ɣ¿ ÈôÈ»£¬ÈÕááÄãÓЙC•þŒ‘×Ô¼ºµÄ script £¬‘ªÒ²²»ëyŒ£éTÖ¸¶¨Ò»‚€ÔO¶¨ÎļþÒÔ¹©²»Í¬µÄ script Ò»Æð"¹²ÓÃ"ÁË... ^_^ okay£¬µ½ß@Ñe£¬ÈôÄã¸ãµÃ¶® fork Åc source µÄ²»Í¬£¬ÄǽÓÏÂ?íÔÙ½ÓÊÜÒ»‚€Ìô‘𣺠---- ÄÇ exec ÓÖÅc source/fork Óкβ»Í¬ÄØ£¿ Ŷ... ÒªÁ˽â exec »òÔSÝ^žéÑ}ës£¬ÓÈÆä³¶ÉÏ File Descriptor µÄÔ’... ²»ß^£¬º††Î?íÕf£º * exec Ò²ÊÇ׌ script ÔÚͬһ‚€ÐгÌÉψÌÐУ¬µ«ÊÇÔÓÐÐг̄t±»½YÊøÁË¡£ Ò²¾ÍÊǺ†¶øÑÔÖ®£ºÔÓÐÐг̕þ·ñ½KÖ¹£¬¾ÍÊÇ exec Åc source/fork µÄ×î´ó²î®?ÁË¡£ àÅ£¬¹âÊÇ?ÄÀíÕ“È¥Àí½â£¬»òÔS›]ÄÇüNºÃÏû»¯£¬²»Èç„ÓÊÖ"Œ?×÷+˼¿¼"?íµÄÓ¡ÏñÉî¿ÌŶ¡£ ÏÂÃæ×ŒÎÒ‚ƒŒ‘ƒÉ‚€º††ÎµÄ script £¬·Ö„eÃüÁîžé 1.sh ¼° 2.sh £º 1.sh ´úÂë: #!/bin/bash A=B echo "PID for 1.sh before exec/source/fork:$$" export A echo "1.sh: $A is $A" case $1 in exec) echo "using exec..." exec ./2.sh ;; source) echo "using source..." . ./2.sh ;; *) echo "using fork by default..." ./2.sh ;; esac echo "PID for 1.sh after exec/source/fork:$$" echo "1.sh: $A is $A" 2.sh ´úÂë: #!/bin/bash echo "PID for 2.sh: $$" echo "2.sh get $A=$A from 1.sh" A=C export A echo "2.sh: $A is $A" È»áᣬ·Ö„eÅÜÈçÏÂ…¢”µ?íÓ^²ì½Y¹û£º ´úÂë: $ ./1.sh fork $ ./1.sh source $ ./1.sh exec »òÊÇ£¬ÄãÒ²¿ÉÒÔ…¢¿¼ CU ÉϵÄÁíÒ»ÙN×Ó£º <a href="http://www.chinaunix.net/forum/viewtopic.php?t=191051" target="_blank">http://www.chinaunix.net/forum/viewtopic.php?t=191051</a> ºÃÁË£¬„eÍüÁË×мš±ÈÝ^Ý”³ö½Y¹ûµÄ²»Í¬¼°±³ááµÄÔÒòŶ... ÈôÓÐÒɆ–£¬šgÓÌá³ö?íÒ»ÆðÓ‘Õ“Ó‘Õ“~~~ happy scripting! ^_^ 7) ( ) Åc { } ²îÔÚÄÄ£¿ àÅ£¬ß@´ÎÝpó һϣ¬²»ÖvÌ«¶à... ^_^ ÏÈÕfһϣ¬žéºÎÒªÓà ( ) »ò { } ºÃÁË¡£ ÔS¶à•rºò£¬ÎÒ‚ƒÔÚ shell ²Ù×÷ÉÏ£¬ÐèÒªÔÚÒ»¶¨—l¼þÏÂÒ»´ÎˆÌÐÐ¶à‚€ÃüÁ Ò²¾ÍÊÇÕf£¬ÒªüN²»ˆÌÐУ¬ÒªüN¾ÍÈ«ˆÌÐУ¬¶ø²»ÊÇÿ´ÎÒÀÐòµÄÅДàÊÇ·ñÒªˆÌÐÐÏÂÒ»‚€ÃüÁî¡£ »òÊÇ£¬ÐèÒª?ÄһЩÃüÁîˆÌÐЃžÏÈ´Îí˜Öеõ½»íÃ⣬ÈçËãÐgµÄ 2*(3+4) ÄǘÓ... ß@•rºò£¬ÎÒ‚ƒ¾Í¿ÉÒýÈë"ÃüÁîȺ½M"(command group)µÄ¸ÅÄŒ¢¶à‚€ÃüÁÖÐÌŽÀí¡£ ÔÚ shell command line ÖУ¬Ò»°ãÈË»òÔS²»Ì«Ó‹Ý^ ( ) Åc { } ß@ƒÉŒ¦·ûÌ–µÄ²î®?£¬ ëmÈ»ƒÉÕß¶¼¿ÉŒ¢¶à‚€ÃüÁî×÷Ⱥ½M»¯ÌŽÀí£¬µ«Èô?ļ¼Ðg¼š¹?ÉÏ£¬…sÊǺܲ»Ò»˜ÓµÄ£º ( ) Œ¢ command group ÖÃì¶ sub-shell È¥ˆÌÐУ¬Ò²·Q nested sub-shell¡£ { } „tÊÇÔÚͬһ‚€ shell ƒÈÍê³É£¬Ò²·Qžé non-named command group¡£ Èô£¬Ä㌦ÉÏÒ»Õ嵀 fork Åc source µÄ¸ÅÄî߀ӛµÃÁ˵ÄÔ’£¬ÄǾͲ»ëyÀí½âƒÉÕߵIJî®?ÁË¡£ ÒªÊÇÔÚ command group Öг¶ÉÏ׃Á¿¼°ÆäËûh¾³µÄÐ޸ģ¬ÎÒ‚ƒ¿ÉÒÔ¸ù“þ²»Í¬µÄÐèÇó?íʹÓà ( ) »ò { } ¡£ ͨ³£¶øÑÔ£¬ÈôËù×÷µÄÐÞ¸ÄÊÇÅR•rµÄ£¬ÇÒ²»ÏëÓ°í‘ÔÓлòÒÔááµÄÔO¶¨£¬ÄÇÎÒ‚ƒ¾Í nested sub-shell £¬ ·´Ö®£¬„tÓà non-named command group ¡£ Êǵ쬹â?Ä command line ?í¿´£¬( ) Åc { } µÄ²î„e¾ÍÖvÍêÁË£¬‰òÝpó °É~~~ ^_^ È»¶ø£¬Èôß@ƒÉ‚€ meta ÓÃÔÚÆäËû command meta »òîIÓòÖÐ(Èç Regular Expression)£¬ß€ÊÇÓкܶà²î„eµÄ¡£ Ö»ÊÇ£¬ÎÒ²»´òËãÔÙÈ¥ÕfÃ÷ÁË£¬Áô½o×xÕß×Ô¼ºÂýÂý°l¾òºÃÁË... ÎÒß@ÑeÖ»ÏëÑa³äÒ»‚€¸ÅÄ¾ÍÊÇ function ¡£ ËùÖ^µÄ function £¬¾ÍÊÇÓÃÒ»‚€Ãû×ÖÈ¥ÃüÃûÒ»‚€ command group £¬È»ááÔÙÕ{ÓÃß@‚€Ãû×ÖÈ¥ˆÌÐÐ command group ¡£ ?Ä non-named command group ?íÍÆ”࣬´ó¸ÅÄãÒ²¿ÉÒԲµ½ÎÒÒªÕfµÄÊÇ { } Á˰ɣ¿(yes! ÄãÕæÂ”Ã÷©u ^_^ ) ÔÚ bash ÖУ¬function µÄ¶¨Áx·½Ê½ÓЃɷN£º ·½Ê½Ò»£º ´úÂë: function function_name { command1 command2 command3 .... } ·½Ê½¶þ£º ´úÂë: fuction_name () { command1 command2 command3 .... } ÓÃÄÄÒ»·N·½Ê½ŸoËùÖ^£¬Ö»ÊÇÈôÅöµ½Ëù¶¨ÒâµÄÃû·QÅc¬FÓеÄÃüÁî»ò„eÃû(Alias)ÐnÍ»µÄÔ’£¬·½Ê½¶þ»òÔS•þʧ”¡¡£ µ«·½Ê½¶þÆð´a¿ÉÒÔÉÙ´ò function ß@Ò»´®Ó¢ÎÄ×Öĸ£¬Œ¦‘ÐÈË?íÕf(ÈçÎÒ)£¬ÓֺΘ·²»žéÄØ£¿... ^_^ function ÔÚijһ³Ì¶È?íÕf£¬Ò²¿É·Qžé"º¯Ê½"£¬µ«Õˆ²»ÒªÅc‚÷½y¾Ž³ÌËùʹÓõĺ¯Ê½(library)¸ã»ìÁË£¬®…¾¹ƒÉÕß²î®?ºÜ´ó¡£ ΩһÏàͬµÄÊÇ£¬ÎÒ‚ƒ¶¼¿ÉÒÔëS•rÓÃ"ÒѶ¨ÁxµÄÃû·Q"?íÕ{ÓÃËü‚ƒ... ÈôÎÒ‚ƒÔÚ shell ²Ù×÷ÖУ¬ÐèÒª²»”àµÄÖØ¸²Ù|ÐÐijЩÃüÁÎÒ‚ƒÊ×ÏÈÏëµ½µÄ£¬»òÔSÊÇŒ¢ÃüÁ³ÉÃüÁî¸å(shell script)¡£ ²»ß^£¬ÎÒ‚ƒÒ²¿ÉÒÔŒ‘³É function £¬È»ááÔÚ command line ÖдòÉÏ function_name ¾Í¿É®”Ò»ô²µÄ script ?íʹÓÃÁË¡£ Ö»ÊÇÈôÄãÔÚ shell Öж¨ÁxµÄ function £¬³ýÁË¿ÉÓà unset function_name È¡ÏûÍ⣬һµ©Í˳ö shell £¬function Ò²¸úÖøÈ¡Ïû¡£ È»¶ø£¬ÔÚ script ÖÐʹÓà function …sÓÐÔS¶àºÃÌŽ£¬³ýÁË¿ÉÒÔÌá¸ßÕûów script µÄˆÌÐÐЧÄÜÍâ(ÒòžéÒѱ»ÝdÈë)£¬ ߀¿ÉÒÔ¹?Ê¡ÔS¶àÖØ¸²µÄ´ú´a... º††Î¶øÑÔ£¬ÈôÄã•þŒ¢¶à‚€ÃüÁ³É script ÒÔ¹©Õ{ÓõÄÔ’£¬ÄÇ£¬Äã¿ÉÒÔŒ¢ function ¿´³ÉÊÇ script ÖÐµÄ script ... ^_^ ¶øÇÒ£¬Í¸ß^ÉÏÒ»Õ½é½BµÄ source ÃüÁÎÒ‚ƒ¿ÉÒÔ×ÔÐж¨ÁxÔSÔS¶à¶àºÃÓÃµÄ function £¬ÔÙ¼¯ÖÐŒ‘ÔÚÌØ¶¨ÎļþÖУ¬ È»áᣬÔÚÆäËûµÄ script ÖÐÓà source Œ¢Ëü‚ƒÝdÈë?K·´¸²ˆÌÐС£ ÈôÄãÊÇ RedHat Linux µÄʹÓÃÕߣ¬»òÔS£¬Òѽ›²ÂµÃ³ö /etc/rc.d/init.d/functions ß@‚€ÎļþÊÇ×÷ɶÓõÄÁË~~~ ^_^ okay£¬ÕfÒªÝpó ücµÄÂÄÇß@´Î¾Í•º•rŒ‘µ½ß@°É¡£×£´ó¼ÒŒWÁ•Óä¿ì©u ^_^ 8) $(( )) Åc $( ) ߀ÓÐ${ } ²îÔÚÄÄ£¿ ÎÒ‚ƒÉÏÒ»Õ½é½BÁË ( ) Åc { } µÄ²»Í¬£¬ß@´Î׌ÎÒ‚ƒ”Uչһϣ¬¿´¿´¸ü¶àµÄ׃»¯£º$( ) Åc ${ } ÓÖÊÇÉ¶ÍæÒâƒºÄØ£¿ ÔÚ bash shell ÖУ¬$( ) Åc ` ` (·´ÒýÌ–) ¶¼ÊÇÓÃ?í×öÃüÁîÌæ“QÓÃ(command substitution)µÄ¡£ ËùÖ^µÄÃüÁîÌæ“QÅcÎÒ‚ƒµÚÎåÕÂŒWß^µÄ׃Á¿Ìæ“Q²î²»¶à£¬¶¼ÊÇÓÃ?íÖØ½MÃüÁîÐУº * Íê³ÉÒýÌ–ÑeµÄÃüÁîÐУ¬È»áጢÆä½Y¹ûÌæ“Q³ö?í£¬ÔÙÖØ½MÃüÁîÐС£ ÀýÈ磺 ´úÂë: $ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d) Èç´Ë±ã¿É·½±ãµÃµ½ÉÏÒ»ÐÇÆÚÌìµÄÈÕÆÚÁË... ^_^ ÔÚ²Ù×÷ÉÏ£¬Óà $( ) »ò ` ` ¶¼ŸoËùÖ^£¬Ö»ÊÇÎÒ"‚€ÈË"±ÈÝ^ϲšgÓà $( ) £¬ÀíÓÉÊÇ£º 1, ` ` ºÜÈÝÒ×Åc ' ' ( †ÎÒýÌ–)¸ã»ì?y£¬ÓÈÆäŒ¦³õŒWÕß?íÕf¡£ ÓЕrÔÚÒ»Ð©Ææ¹ÖµÄ×ÖÐÎï@ʾÖУ¬ƒÉ·N·ûÌ–ÊÇһģһ˜ÓµÄ(Ö±ØQƒÉüc)¡£ ®”È»ÁË£¬Óн›òžµÄÅóÓÑ߀ÊÇÒ»ÑÛ¾ÍÄÜ·Ö׃ƒÉÕß¡£Ö»ÊÇ£¬ÈôÄܸüºÃµÄ±ÜÃâ»ì?y£¬ÓֺΘ·²»žéÄØ£¿ ^_^ 2, ÔÚ¶àŒÓ´ÎµÄ?ͺÏÌæ“QÖУ¬` ` íšÒªî~ÍâµÄÌøÃ“( ` )ÌŽÀí£¬¶ø $( ) „t±ÈÝ^Ö±Ó^¡£ÀýÈ磺 ß@ÊÇåeµÄ£º ´úÂë: command1 `command2 `command3` ` Ô±¾µÄÒâˆDÊÇÒªÔÚ command2 `command3` ÏÈŒ¢ command3 Ìá“Q³ö?í½o command 2 ÌŽÀí£¬ È»ááÔÙŒ¢½Y¹û‚÷½o command1 `command2 ...` ?íÌŽÀí¡£ È»¶ø£¬ÕæÕýµÄ½Y¹ûÔÚÃüÁîÐÐÖÐ…sÊÇ·Ö³ÉÁË `command2 ` Åc `` ƒÉ¶Î¡£ Õý´_µÄÝ”È둪ԓÈçÏ£º ´úÂë: command1 `command2 `command3` ` Òª²»È»£¬“Q³É $( ) ¾Í›]†–î}ÁË£º ´úÂë: command1 $(command2 $(command3)) Ö»ÒªÄãϲšg£¬×ö¶àÉٌӵÄÌæ“Q¶¼›]†–î}À²~~~ ^_^ ²»ß^£¬$( ) ?K²»ÊÇ›]ÓДÀ¶ËµÄ... Ê×ÏÈ£¬` ` »ù±¾ÉÏ¿ÉÓÃÔÚÈ«²¿µÄ unix shell ÖÐʹÓã¬ÈôŒ‘³É shell script £¬ÆäÒÆÖ²ÐÔ±ÈÝ^¸ß¡£ ¶ø $( ) ?K²»ÒеÄÿһ·N shell ¶¼ÄÜʹÓã¬ÎÒÖ»ÄܸúÄãÕf£¬ÈôÄãÓà bash2 µÄÔ’£¬¿Ï¶¨›]†–î}... ^_^ ½ÓÏÂ?í£¬ÔÙ׌ÎÒ‚ƒ¿´ ${ } °É... ËüÆäŒ?¾ÍÊÇÓÃ?í×÷׃Á¿Ìæ“QÓõÄÀ²¡£ Ò»°ãÇé›rÏ£¬$var Åc ${var} ?K›]ÓÐɶ²»Ò»˜Ó¡£ µ«ÊÇÓà ${ } •þ±ÈÝ^¾«´_µÄ½ç¶¨×ƒÁ¿Ãû·QµÄ¹ ‡ú£¬±È·½Õf£º ´úÂë: $ A=B $ echo $AB Ô±¾ÊÇ´òËãÏÈŒ¢ $A µÄ½Y¹ûÌæ“Q³ö?í£¬È»ááÔÙÑaÒ»‚€ B ×ÖÄ¸ì¶Æäáᣬ µ«ÔÚÃüÁîÐÐÉÏ£¬ÕæÕýµÄ½Y¹û…sÊÇÖ»•þÌá“Q׃Á¿Ãû·Qžé AB µÄÖµ³ö?í... ÈôʹÓà ${ } ¾Í›]†–î}ÁË£º ´úÂë: $ echo ${A}B BB ²»ß^£¬¼ÙÈçÄãÖ»¿´µ½ ${ } Ö»ÄÜÓÃ?í½ç¶¨×ƒÁ¿Ãû·QµÄÔ’£¬ÄÇÄã¾ÍŒ?ÔÚ̫С¿´ bash ÁË©u ÓÐÅdȤµÄÔ’£¬Äã¿ÉÏÈ…¢¿¼Ò»Ï cu ±¾°æµÄ¾«ÈAÎÄÕ£º <a href="http://www.chinaunix.net/forum/viewtopic.php?t=201843" target="_blank">http://www.chinaunix.net/forum/viewtopic.php?t=201843</a> žéÁËÍêÕûÆðÒŠ£¬ÎÒß@ÑeÔÙÓÃһЩÀý×Ó¼ÓÒÔÕfÃ÷ ${ } µÄÒ»Ð©ÌØ®?¹¦ÄÜ£º ¼ÙÔOÎÒ‚ƒ¶¨ÁxÁËÒ»‚€×ƒÁ¿žé£º file=/dir1/dir2/dir3/my.file.txt ÎÒ‚ƒ¿ÉÒÔÓà ${ } ·Ö„eÌæ“Q«@µÃ²»Í¬µÄÖµ£º ${file#*/}£ºÄõôµÚÒ»—l / ¼°Æä×óß…µÄ×Ö´®£ºdir1/dir2/dir3/my.file.txt ${file##*/}£ºÄõô×îááÒ»—l / ¼°Æä×óß…µÄ×Ö´®£ºmy.file.txt ${file#*.}£ºÄõôµÚÒ»‚€ . ¼°Æä×óß…µÄ×Ö´®£ºfile.txt ${file##*.}£ºÄõô×îááÒ»‚€ . ¼°Æä×óß…µÄ×Ö´®£ºtxt ${file%/*}£ºÄõô×îáá—l / ¼°ÆäÓÒß…µÄ×Ö´®£º/dir1/dir2/dir3 ${file%%/*}£ºÄõôµÚÒ»—l / ¼°ÆäÓÒß…µÄ×Ö´®£º(¿ÕÖµ) ${file%.*}£ºÄõô×îááÒ»‚€ . ¼°ÆäÓÒß…µÄ×Ö´®£º/dir1/dir2/dir3/my.file ${file%%.*}£ºÄõôµÚÒ»‚€ . ¼°ÆäÓÒß…µÄ×Ö´®£º/dir1/dir2/dir3/my Ó›‘›µÄ·½·¨žé£º # ÊÇÈ¥µô×óß…(ÔÚèa±PÉÏ # ÔÚ $ Ö®×óß…) % ÊÇÈ¥µôÓÒß…(ÔÚèa±PÉÏ % ÔÚ $ Ö®ÓÒß…) †ÎÒ»·ûÌ–ÊÇ×îСƥÅä©rƒÉ‚€·ûÌ–ÊÇ×î´óÆ¥Åä¡£ ${file:0:5}£ºÌáÈ¡×î×óß…µÄ 5 ‚€×Ö¹?£º/dir1 ${file:5:5}£ºÌáÈ¡µÚ 5 ‚€×Ö¹?ÓÒß…µÄßBÀm 5 ‚€×Ö¹?£º/dir2 ÎÒ‚ƒÒ²¿ÉÒÔŒ¦×ƒÁ¿ÖµÑeµÄ×Ö´®×÷Ìæ“Q£º ${file/dir/path}£ºŒ¢µÚÒ»‚€ dir Ìá“Qžé path£º/path1/dir2/dir3/my.file.txt ${file//dir/path}£ºŒ¢È«²¿ dir Ìá“Qžé path£º/path1/path2/path3/my.file.txt ÀûÓà ${ } ߀¿Éᘌ¦²»Í¬µÄ׃”µ î‘BÙxÖµ(›]ÔO¶¨¡¢¿ÕÖµ¡¢·Ç¿ÕÖµ)£º ${file-my.file.txt} £º¼ÙÈç $file žé¿ÕÖµ£¬„tʹÓà my.file.txt ×÷ĬÕJÖµ¡£(±£Áô›]ÔO¶¨¼°·Ç¿ÕÖµ) ${file:-my.file.txt} £º¼ÙÈç $file ›]ÓÐÔO¶¨»òžé¿ÕÖµ£¬„tʹÓà my.file.txt ×÷ĬÕJÖµ¡£ (±£Áô·Ç¿ÕÖµ) ${file+my.file.txt} £º²»¹Ü $file žéºÎÖµ£¬¾ùʹÓà my.file.txt ×÷ĬÕJÖµ¡£ (²»±£ÁôÈκÎÖµ) ${file:+my.file.txt} £º³ý·Ç $file žé¿ÕÖµ£¬·ñ„tʹÓà my.file.txt ×÷ĬÕJÖµ¡£ (±£Áô¿ÕÖµ) ${file=my.file.txt} £ºÈô $file ›]ÔO¶¨£¬„tʹÓà my.file.txt ×÷ĬÕJÖµ£¬Í¬•rŒ¢ $file ¶¨Áxžé·Ç¿ÕÖµ¡£ (±£Áô¿ÕÖµ¼°·Ç¿ÕÖµ) ${file:=my.file.txt} £ºÈô $file ›]ÔO¶¨»òžé¿ÕÖµ£¬„tʹÓà my.file.txt ×÷ĬÕJÖµ£¬Í¬•rŒ¢ $file ¶¨Áxžé·Ç¿ÕÖµ¡£ (±£Áô·Ç¿ÕÖµ) ${file?my.file.txt} £ºÈô $file ›]ÔO¶¨£¬„tŒ¢ my.file.txt Ý”³öÖÁ STDERR¡£ (±£Áô¿ÕÖµ¼°·Ç¿ÕÖµ)) ${file:?my.file.txt} £ºÈô $file ›]ÔO¶¨»òžé¿ÕÖµ£¬„tŒ¢ my.file.txt Ý”³öÖÁ STDERR¡£ (±£Áô·Ç¿ÕÖµ) ߀ÓÐŶ£¬${#var} ¿ÉÓ‹Ëã³ö׃Á¿ÖµµÄéL¶È£º ${#file} ¿ÉµÃµ½ 27 £¬Òòžé /dir1/dir2/dir3/my.file.txt „‚ºÃÊÇ 27 ‚€×Ö¹?... ½ÓÏÂ?í£¬ÔÙžé´ó¼Ò½éÉÔһϠbash µÄ½M”µ(array)ÌŽÀí·½·¨¡£ Ò»°ã¶øÑÔ£¬A="a b c def" ß@˜ÓµÄ׃Á¿Ö»ÊÇŒ¢ $A Ìæ“QžéÒ»‚€†ÎÒ»µÄ×Ö´®£¬ µ«ÊǸĞé A=(a b c def) £¬„tÊÇŒ¢ $A ¶¨Áxžé½M”µ... bash µÄ½M”µÌæ“Q·½·¨¿É…¢¿¼ÈçÏ·½·¨£º ${A[@]} »ò ${A[*]} ¿ÉµÃµ½ a b c def (È«²¿½M”µ) ${A[0]} ¿ÉµÃµ½ a (µÚÒ»‚€½M”µ)£¬${A[1]} „tžéµÚ¶þ‚€½M”µ... ${#A[@]} »ò ${#A[*]} ¿ÉµÃµ½ 4 (È«²¿½M”µ”µÁ¿) ${#A[0]} ¿ÉµÃµ½ 1 (¼´µÚÒ»‚€½M”µ(a)µÄéL¶È)£¬${A[3]} ¿ÉµÃµ½ 3 (µÚÒ»‚€½M”µ(def)µÄéL¶È) A[3]=xyz „tÊÇŒ¢µÚ 4 ‚€½M”µÖØÐ¶¨Áxžé xyz ... ÖTÈç´Ëî?µÄ.... Ä܉òÉÆÓà bash µÄ $( ) Åc ${ } ¿É´ó´óÌá¸ß¼°º†»¯ shell ÔÚ׃Á¿ÉϵÄÌŽÀíÄÜÁ¦Å¶~~~ ^_^ ºÃÁË£¬×îáážé´ó¼Ò½é½B $(( )) µÄÓÃ;°É£ºËüÊÇÓÃ?í×÷Õû”µßËãµÄ¡£ ÔÚ bash ÖУ¬$(( )) µÄÕû”µßËã·ûÌ–´óÖÂÓÐß@Щ£º + - * / £º·Ö„ežé "¼Ó¡¢œp¡¢³Ë¡¢³ý"¡£ % £ºðN”µßËã & | ^ !£º·Ö„ežé "AND¡¢OR¡¢XOR¡¢NOT" ßËã¡£ Àý£º ´úÂë: $ a=5; b=7; c=2 $ echo $(( a+b*c )) 19 $ echo $(( (a+b)/c )) 6 $ echo $(( (a*b)%c)) 1 ÔÚ $(( )) ÖеÄ׃Á¿£¬¿ÉÓà $ ·ûÌ–?íÌæ“Q£¬Ò²¿ÉÒÔ²»Óã¬È磺 $(( $a + $b * $c)) Ò²¿ÉµÃµ½ 19 µÄ½Y¹û ´ËÍ⣬$(( )) ߀¿É×÷²»Í¬ßMλ(Èç¶þßMλ¡¢°ËßMλ¡¢Ê®ÁùßMλ)×÷ßËãÄØ£¬Ö»ÊÇ£¬Ý”³ö½Y¹û½ÔžéÊ®ßMλ¶øÒÑ£º echo $((16#2a)) ½Y¹ûžé 42 (16ßMλÞDÊ®ßMλ) ÒÔÒ»‚€Œ?ÓõÄÀý×Ó?í¿´¿´°É£º ¼ÙÈ箔ǰµÄ umask ÊÇ 022 £¬ÄÇüNн¨ÎļþµÄ™àÏÞ¼´žé£º ´úÂë: $ umask 022 $ echo "obase=8;$(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc 644 ÊÂŒ?ÉÏ£¬†Î¼ƒÓà (( )) Ò²¿ÉÖØ¶¨Áx׃Á¿Öµ£¬»ò×÷ testing£º a=5; ((a++)) ¿ÉŒ¢ $a ÖØ¶¨Áxžé 6 a=5; ((a--)) „tžé a=4 a=5; b=7; ((a < b)) •þµÃµ½ 0 (true) µÄ·µ»ØÖµ¡£ ³£ÒеÄÓÃì¶ (( )) µÄœyÔ‡·ûÌ–ÓÐÈçÏÂß@Щ£º <£ºÐ¡ì¶ >£º´óì¶ <=£ºÐ¡ì¶»òµÈì¶ >=£º´óì¶»òµÈì¶ ==£ºµÈì¶ !=£º²»µÈì¶ ²»ß^£¬Ê¹Óà (( )) ×÷Õû”µœyÔ‡•r£¬Õˆ²»Òª¸ú [ ] µÄÕû”µœyÔ‡¸ã»ì?yÁË¡£(¸ü¶àµÄœyÔ‡ÎÒŒ¢ì¶µÚʮ՞é´ó¼Ò½é½B) Ôõ˜Ó£¿ºÃÍæ°É.. ^_^ okay£¬ß@´Î•º•rÕfß@üN¶à... ÉÏÃæµÄ½é½B£¬?K›]ÓÐÔ”ÁÐÿһ·N¿ÉÓÃµÄ î‘B£¬¸ü¶àµÄ£¬¾ÍÕˆ×xÕß…¢¿¼ÊÖƒÔÎļþ‡Ó... 9) $@ Åc $* ²îÔÚÄÄ£¿ ÒªÕf $@ Åc $* ֮ǰ£¬ÐèµÃÏÈ?Ä shell script µÄ positional parameter Õ„Æð... ÎÒ‚ƒ¶¼Òѽ›ÖªµÀ׃Á¿(variable)ÊÇÈçºÎ¶¨Áx¼°Ìæ“QµÄ£¬ß@‚€²»ÓÃÔÙ¶àÖvÁË¡£ µ«ÊÇ£¬ÎÒ‚ƒß€ÐèÒªÖªµÀÓÐЩ׃Á¿ÊÇ shell ƒÈ¶¨µÄ£¬ÇÒÆäÃû·QÊÇÎÒ‚ƒ²»ÄÜëSÒâÐ޸ĵģ¬ ÆäÖоÍÓÐ positional parameter Ôڃȡ£ ÔÚ shell script ÖУ¬ÎÒ‚ƒ¿ÉÓà $0, $1, $2, $3 ... ß@˜ÓµÄ׃Á¿·Ö„eÌáÈ¡ÃüÁîÐÐÖеÄÈçϲ¿·Ý£º ´úÂë: script_name parameter1 parameter2 parameter3 ... ÎÒ‚ƒºÜÈÝÒ×¾ÍÄܲ³ö $0 ¾ÍÊÇ´ú±í shell script Ãû·Q(·ޟ)±¾Éí£¬¶ø $1 ¾ÍÊÇÆäááµÄµÚÒ»‚€…¢”µ£¬Èç´Ëî?ÍÆ.... íšµÃÁôÒâµÄÊÇ IFS µÄ×÷Óã¬Ò²¾ÍÊÇ£¬Èô IFS ±» quoting ÌŽÀíáᣬÄÇüN positional parameter Ò²•þ¸Ä׃¡£ ÈçÏÂÀý£º ´úÂë: my.sh p1 "p2 p3" p4 ÓÉì¶ÔÚ p2 Åc p3 Ö®égµÄ¿Õ°×æI±» soft quote ËùêPé]ÁË£¬Òò´Ë my.sh ÖÐµÄ $2 ÊÇ "p2 p3" ¶ø $3 „tÊÇ p4 ... ߀ӛµÃǰƒÉÕÂÎÒ‚ƒÌáµ½ fucntion •r£¬ÎÒ²»ÊÇÕfß^ËüÊÇ script ÖÐµÄ script †á£¿ ^_^ Êǵģ¬function Ò»˜Ó¿ÉÒÔ×xÈ¡×Ô¼ºµÄ(ÓЄeì¶ script µÄ) postitional parameter £¬Î©Ò»ÀýÍâµÄÊÇ $0 ¶øÒÑ¡£ ÅeÀý¶øÑÔ£º¼ÙÔO my.sh ÑeÓÐÒ»‚€ fucntion ½Ð my_fun , ÈôÔÚ script ÖÐÅÜ my_fun fp1 fp2 fp3 £¬ ÄÇüN£¬function ƒÈµÄ $0 ÊÇ my.sh £¬¶ø $1 „tÊÇ fp1 ¶ø·Ç p1 ÁË... ²»È猑‚€º††ÎµÄ my.sh script ¿´¿´°É£º ´úÂë: #!/bin/bash my_fun() { echo '$0 inside function is '$0 echo '$1 inside function is '$1 echo '$2 inside function is '$2 } echo '$0 outside function is '$0 echo '$1 outside function is '$1 echo '$2 outside function is '$2 my_fun fp1 "fp2 fp3" È»ááÔÚ command line ÖÐÅÜһϠscript ¾ÍÖªµÀÁË£º ´úÂë: chmod +x my.sh ./my.sh p1 "p2 p3" $0 outside function is ./my.sh $1 outside function is p1 $2 outside function is p2 p3 $0 inside function is ./my.sh $1 inside function is fp1 $2 inside function is fp2 fp3 È»¶ø£¬ÔÚʹÓà positional parameter µÄ•rºò£¬ÎÒ‚ƒÒª×¢ÒâһЩÏÝÚåŶ£º * $10 ²»ÊÇÌæ“QµÚ 10 ‚€…¢”µ£¬¶øÊÇÌæ“QµÚÒ»‚€…¢”µ($1)È»ááÔÙÑaÒ»‚€ 0 ì¶Æäáá©u Ò²¾ÍÊÇ£¬my.sh one two three four five six seven eigth nine ten ß@˜ÓµÄ command line £¬ my.sh ÑeµÄ $10 ²»ÊÇ ten ¶øÊÇ one0 Ŷ... СÐÄСÐÄ©u Ҫץµ½ ten µÄÔ’£¬ÓЃɷN·½·¨£º ·½·¨Ò»ÊÇʹÓÃÎÒ‚ƒÉÏÒ»Õ½é½BµÄ ${ } £¬Ò²¾ÍÊÇÓà ${10} ¼´¿É¡£ ·½·¨¶þ£¬¾ÍÊÇ shift ÁË¡£ ÓÃͨË×µÄÕf·¨?íÕf£¬ËùÖ^µÄ shift ¾ÍÊÇÈ¡Ïû positional parameter ÖÐ×î×óß…µÄ…¢”µ( $0 ²»ÊÜÓ°í‘)¡£ ÆäîAÔOÖµžé 1 £¬Ò²¾ÍÊÇ shift »ò shift 1 ¶¼ÊÇÈ¡Ïû $1 £¬¶øÔ±¾µÄ $2 „t׃³É $1¡¢$3 ׃³É $2 ... Èô shift 3 „tÊÇÈ¡ÏûÇ°ÃæÈý‚€…¢”µ£¬Ò²¾ÍÊÇÔ±¾µÄ $4 Œ¢×ƒ³É $1 ... ÄÇ£¬ÓH?ÛµÄ×xÕߣ¬ÄãÕfÒª shift µô¶àÉÙ‚€…¢”µ£¬²Å¿ÉÓà $1 È¡µÃ ${10} ÄØ£¿ ^_^ okay£¬®”ÎÒ‚ƒŒ¦ positional parameter ÓÐÁË»ù±¾¸ÅÄîÖ®áᣬÄÇÔÙ׌ÎÒ‚ƒ¿´¿´ÆäËûÏàêP׃Á¿°É¡£ Ê×ÏÈÊÇ $# £ºËü¿É×¥³ö positional parameter µÄ”µÁ¿¡£ ÒÔÇ°ÃæµÄ my.sh p1 "p2 p3" žéÀý£º ÓÉì¶ p2 Åc p3 Ö®égµÄ IFS ÊÇÔÚ soft quote ÖУ¬Òò´Ë $# ¿ÉµÃµ½ 2 µÄÖµ¡£ µ«Èç¹û p2 Åc p3 ›]ÓÐÖÃì¶ quoting ÖÐÔ’£¬ÄÇ $# ¾Í¿ÉµÃµ½ 3 µÄÖµÁË¡£ ͬ˜ÓµÄµÀÀíÔÚ function ÖÐÒ²ÊÇÒ»˜ÓµÄ... Òò´Ë£¬ÎÒ‚ƒ³£ÔÚ shell script ÑeÓÃÈçÏ·½·¨œyÔ‡ script ÊÇ·ñÓÐ×xßM…¢”µ£º ´úÂë: [ $# = 0 ] ¼ÙÈçžé 0 £¬ÄǾͱíʾ script ›]ÓÐ…¢”µ£¬·ñ„t¾ÍÊÇÓÐŽ§…¢”µ... ½ÓÏÂ?í¾ÍÊÇ $@ Åc $* £º ¾«´_?íÖv£¬ƒÉÕßÖ»ÓÐÔÚ soft quote ÖвÅÓвî®?£¬·ñ„t£¬¶¼±íʾ"È«²¿…¢”µ"( $0 ³ýÍâ)¡£ ÅeÀý?íÕfºÃÁË£º ÈôÔÚ command line ÉÏÅÜ my.sh p1 "p2 p3" p4 µÄÔ’£¬ ²»¹ÜÊÇ $@ ߀ÊÇ $* £¬¶¼¿ÉµÃµ½ p1 p2 p3 p4 ¾ÍÊÇÁË¡£ µ«ÊÇ£¬Èç¹ûÖÃì¶ soft quote ÖеÄÔ’£º "$@" „t¿ÉµÃµ½ "p1" "p2 p3" "p4" ß@Èý‚€²»Í¬µÄÔ~¶Î(word)©r "$*" „t¿ÉµÃµ½ "p1 p2 p3 p4" ß@Ò»Õû´®†ÎÒ»µÄÔ~¶Î¡£ ÎÒ‚ƒ¿ÉÐÞ¸ÄÒ»ÏÂÇ°ÃæµÄ my.sh £¬Ê¹Ö®ƒÈÈÝÈçÏ£º ´úÂë: #!/bin/bash my_fun() { echo "$#" } echo 'the number of parameter in "$@" is '$(my_fun "$@") echo 'the number of parameter in "$*" is '$(my_fun "$*") È»ááÔÙˆÌÐÐ ./my.sh p1 "p2 p3" p4 ¾ÍÖªµÀ $@ Åc $* ²îÔÚÄÄÁË ... ^_^ 10) && Åc || ²îÔÚÄÄ£¿ ºÃ²»ÈÝÒ×£¬ßMÈëƒÉλ”µµÄÕ¹?ÁË... һ·×ß?í£¬ºÜÐÁ¿à°É£¿Ò²ºÜ¿ì˜·°É£¿ ^_^ ÔÚ½â´ð±¾ÕÂî}Ŀ֮ǰ£¬ÏÈ׌ÎÒ‚ƒÁ˽âÒ»‚€¸ÅÄreturn value ©u ÎÒ‚ƒÔÚ shell ÏÂÅܵÄÿһ‚€ command »ò function £¬ÔÚ½YÊøµÄ•rºò¶¼•þ‚÷»Ø¸¸ÐгÌÒ»‚€Öµ£¬·Qžé return value ¡£ ÔÚ shell command line ÖпÉÓà $? ß@‚€×ƒÁ¿µÃµ½×î"ÐÂ"µÄÒ»‚€ return value £¬Ò²¾ÍÊÇ„‚½YÊøµÄÄÇ‚€Ðг̂÷»ØµÄÖµ¡£ Return Value(RV) µÄȡֵžé 0-255 Ö®ég£¬ÓɳÌʽ(»ò script)µÄ×÷Õß×ÔÐж¨×h£º * ÈôÔÚ script Ñe£¬Óà exit RV ?íÖ¸¶¨ÆäÖµ£¬Èô›]Ö¸¶¨£¬ÔÚ½YÊø•rÒÔ×îááÒ»µÀÃüÁîÖ® RV žéÖµ¡£ * ÈôÔÚ function Ñe£¬„tÓà return RV ?í´úÌæ exit RV ¼´¿É¡£ Return Value µÄ×÷Óã¬ÊÇÓÃ?íÅДàÐг̵ÄÍ˳ö î‘B(exit status)£¬Ö»ÓЃɷN£º * 0 µÄÔ’žé"Õæ"( true ) * ·Ç 0 µÄÔ’žé"¼Ù"( false ) Åe‚€Àý×Ó?íÕfÃ÷ºÃÁË£º ¼ÙÔO®”ǰĿ䛃ÈÓÐÒ»·Ý my.file µÄÎļþ£¬¶ø no.file ÊDz»´æÔڵģº ´úÂë: $ touch my.file $ ls my.file $ echo $? # first echo 0 $ ls no.file ls: no.file: No such file or directory $ echo $? # second echo 1 $ echo $? # third echo 0 ÉÏÀýµÄµÚÒ»‚€ echo ÊÇêPì¶ ls my.file µÄ RV £¬¿ÉµÃµ½ 0 µÄÖµ£¬Òò´Ëžé true ©r µÚ¶þ‚€ echo ÊÇêPì¶ ls no.file µÄ RV £¬„tµÃµ½·Ç 0 µÄÖµ£¬Òò´Ëžé false ©r µÚÈý‚€ echo ÊÇêPì¶µÚ¶þ‚€ echo $? µÄ RV £¬žé 0 µÄÖµ£¬Òò´ËÒ²žé true ¡£ Ոӛס£ºÃ¿Ò»‚€ command ÔÚ½YÊø•r¶¼•þËÍ»Ø return value µÄ©u²»¹ÜÄãÅÜÉõüN˜ÓµÄÃüÁî... È»¶ø£¬ÓÐÒ»‚€ÃüÁî…sÊÇ"Œ£éT"ÓÃ?íœyԇijһ—l¼þ¶øËͳö return value ÒÔ¹© true »ò false µÄÅД࣬ Ëü¾ÍÊÇ test ÃüÁîÁË©u ÈôÄãÓõÄÊÇ bash £¬ÕˆÔÚ command line Ï´ò man test »ò man bash ?íÁ˽âß@‚€ test µÄÓ÷¨¡£ ß@ÊÇÄã¿ÉÓÃ×÷…¢¿¼µÄ×´_µÄÎļþÁË£¬ÒªÊÇ „eÈËÕfµÄ£¬ƒH×÷…¢¿¼¾ÍºÃ... ÏÂÃæÎÒÖ»º††Î×÷һЩÝoÖúÕfÃ÷£¬ÆäðNµÄÒ»ÂÉÒÔ man žéœÊ£º Ê×ÏÈ£¬test µÄ±íʾʽÎÒ‚ƒ·Qžé expression £¬ÆäÃüÁî¸ñʽÓЃɷN£º ´úÂë: test expression or: [ expression ] (Õˆ„Õ±Ø×¢Òâ [ ] Ö®égµÄ¿Õ°×æI©u) ÓÃÄÄÒ»·N¸ñʽ›]ËùÖ^£¬¶¼ÊÇÒ»˜ÓµÄЧ¹û¡£(ÎÒ‚€È˱ÈÝ^ϲšgááÕß...) Æä´Î£¬bash µÄ test Ŀǰ֧ԮµÄœyÔ‡Œ¦ÏñÖ»ÓÐÈý·N£º * string£º×Ö´®£¬Ò²¾ÍÊǼƒÎÄ×Ö¡£ * integer£ºÕû”µ( 0 »òÕýÕû”µ£¬²»º¬Ø“”µ»òС”µüc)¡£ * file£ºÎļþ¡£ Õˆ³õŒWÕßÒ»¶¨Òª¸ãÇå³þß@ÈýÕߵIJî®?£¬Òòžé test ËùÓÃµÄ expression ÊDz»Ò»˜ÓµÄ¡£ ÒÔ A=123 ß@‚€×ƒÁ¿žéÀý£º * [ "$A" = 123 ]£ºÊÇ×Ö´®µÄœyÔ‡£¬ÒÔœyÔ‡ $A ÊÇ·ñžé 1¡¢2¡¢3 ß@Èý‚€ßBÀmµÄ"ÎÄ×Ö"¡£ * [ "$A" -eq 123 ]£ºÊÇÕû”µµÄœyÔ‡£¬ÒÔœyÔ‡ $A ÊÇ·ñµÈì¶"Ò»°Ù¶þÊ®Èý"¡£ * [ -e "$A" ]£ºÊÇêPì¶ÎļþµÄœyÔ‡£¬ÒÔœyÔ‡ 123 ß@·Ý"Îļþ"ÊÇ·ñ´æÔÚ¡£ µÚÈý£¬®” expression œyÔ‡žé"Õæ"•r£¬test ¾ÍËÍ»Ø 0 (true) µÄ return value £¬·ñ„tËͳö·Ç 0 (false)¡£ ÈôÔÚ expression ֮ǰ¼ÓÉÏÒ»‚€ " ! "(¸Ð‡@Ì–)£¬„tÊÇ®” expression žé"¼Ù•r" ²ÅËͳö 0 £¬·ñ„tËͳö·Ç 0 ¡£ ͬ•r£¬test Ò²ÔÊÔS¶àÖØµÄ¸²ºÏœyÔ‡£º * expression1 -a expression2 £º®”ƒÉ‚€ exrepssion ¶¼žé true £¬²ÅËͳö 0 £¬·ñ„tËͳö·Ç 0 ¡£ * expression1 -o expression2 £ºÖ»ÐèÆäÖÐÒ»‚€ exrepssion žé true £¬¾ÍËͳö 0 £¬Ö»ÓЃÉÕß¶¼žé false ²ÅËͳö·Ç 0 ¡£ ÀýÈ磺 ´úÂë: [ -d "$file" -a -x "$file" ] ÊDZíʾ®” $file ÊÇÒ»‚€Ä¿ä›¡¢ÇÒͬ•r¾ßÓÐ x ™àÏÞ•r£¬test ²Å•þžé true ¡£ µÚËÄ£¬ÔÚ command line ÖÐʹÓà test •r£¬Õˆ„eÍüÓ›ÃüÁîÐеÄ"ÖØ½M"ÌØÐÔ£¬ Ò²¾ÍÊÇÔÚÅöµ½ meta •r•þÏÈÌŽÀí meta ÔÙÖØÐ½M½¨ÃüÁîÐС£(ß@‚€ÌØÐÔÎÒÔÚµÚ¶þ¼°µÚËÄÕ¶¼Ôø·´¸²?ŠÕ{ß^) ±È·½Õf£¬Èô test Åöµ½×ƒÁ¿»òÃüÁîÌæ“Q•r£¬Èô²»ÄÜ?M×ã expression ¸ñʽ•r£¬Œ¢•þµÃµ½ÕZ·¨åeÕ`µÄ½Y¹û¡£ ÅeÀý?íÕfºÃÁË£º êPì¶ [ string1 = string2 ] ß@‚€ test ¸ñʽ£¬ ÔÚ = Ì–ƒÉß…±ØíšÒªÓÐ×Ö´®£¬ÆäÖаüÀ¨¿Õ(null)×Ö´®(¿ÉÓà soft quote »ò hard quote È¡µÃ)¡£ ¼ÙÈç $A Ŀǰ›]Óж¨Áx£¬»ò±»¶¨×hžé¿Õ×Ö´®µÄÔ’£¬ÄÇÈçÏµČ‘·¨Œ¢•þʧ”¡£º ´úÂë: $ unset A $ [ $A = abc ] [: =: unary operator expected ß@ÊÇÒòžéÃüÁîÐÐÅöµ½ $ ß@‚€ meta •r£¬•þÌæ“Q $A µÄÖµ£¬È»ááÔÙÖØ½MÃüÁîÐУ¬ÄǾÍ׃³ÉÁË£º [ = abc ] Èç´ËÒ»?í = Ì–×óß…¾Í›]ÓÐ×Ö´®´æÔÚÁË£¬Òò´ËÔì³É test µÄÕZ·¨åeÕ`©u µ«ÊÇ£¬ÏÂÃæß@‚€Œ‘·¨„tÊdzÉÁ¢µÄ£º ´úÂë: $ [ "$A" = abc ] $ echo $? 1 ß@ÊÇÒòžéÔÚÃüÁîÐÐÖØ½MááµÄ½Y¹ûžé£º [ "" = abc ] ÓÉì¶ = ×óß…ÎÒ‚ƒÓà soft quote µÃµ½Ò»‚€¿Õ×Ö´®£¬¶ø×Œ test ÕZ·¨µÃÒÔͨß^... ×xÕßÖT¾ýÕˆ„Õ±ØÁôÒâß@Щ¼š¹?Ŷ£¬ÒòžéÉÔÒ»²»É÷£¬Œ¢•þŒ§ÖÁ test µÄ½Y¹û׃ÁË‚€˜Ó©u ÈôÄúŒ¦ test ߀²»ÊǺÜÓн›òžµÄÔ’£¬ÄÇÔÚʹÓà test •r²»·ÁÏÈ’ñÓÃÈçÏÂß@Ò»‚€"·¨„t"£º * ¼ÙÈçÔÚ test ÖÐÅöµ½×ƒÁ¿Ìæ“Q£¬Óà soft quote ÊÇ×î±£ëUµÄ©u ÈôÄ㌦ quoting ²»ÊìµÄÔ’£¬ÕˆÖØÐœØÁ•µÚËÄÕµăÈÈݰÉ... ^_^ okay£¬êP춸ü¶àµÄ test Ó÷¨£¬ÀÏÔ’Ò»¾ä£ºÕˆ¿´ man page °É©u ^_^ ëmÈ»ÑóÑ󞢞¢ÖvÁËÒ»´ó¶Ñ£¬»òÔSÄã߀ÔÚàÖ¹¾.... ÄÇ... ÄÇ‚€ return value ÓÐɶÓ𡣿©u †–µÃºÃ©u ¸æÔVÄ㣺return value µÄ×÷ÓÿɴóÁË©uÈôÄãÏë׌ÄãµÄ shell ׃"”Ã÷"µÄÔ’£¬¾ÍÈ«¿¿ËüÁË£º * ÓÐÁË return value£¬ÎÒ‚ƒ¿ÉÒÔ׌ shell ¸ú“þ²»Í¬µÄ î‘B×ö²»Í¬µÄ•rÇé... ß@•rºò£¬²Å׌ÎÒ?í½Ò•Ô±¾ÕµĴ𰸰É~~~ ^_^ && Åc || ¶¼ÊÇÓÃ?í"½M½¨"¶à‚€ command line Óõģº * command1 && command2 £ºÆäÒâ˼ÊÇ command2 Ö»ÓÐÔÚ RV žé 0 (true) µÄ—l¼þψÌÐС£ * command1 || command2 £ºÆäÒâ˼ÊÇ command2 Ö»ÓÐÔÚ RV žé·Ç 0 (false) µÄ—l¼þψÌÐС£ ?í£¬ÒÔÀý×Ó?íÕfºÃÁË£º ´úÂë: $ A=123 $ [ -n "$A" ] && echo "yes! it's ture." yes! it's ture. $ unset A $ [ -n "$A" ] && echo "yes! it's ture." $ [ -n "$A" ] || echo "no, it's NOT ture." no, it's NOT ture. (Ô]£º[ -n string ] ÊÇœyÔ‡ string éL¶È´óì¶ 0 „tžé true ¡£) ÉÏÀýµÄµÚÒ»‚€ && ÃüÁîÐÐÖ®ËùÒÔ•þˆÌÐÐÆäÓÒß…µÄ echo ÃüÁÊÇÒòžéÉÏÒ»‚€ test ËÍ»ØÁË 0 µÄ RV Öµ©r µ«µÚ¶þ´Î¾Í²»•þˆÌÐУ¬Òòžéžé test ËÍ»Ø·Ç 0 µÄ½Y¹û... ͬÀí£¬|| ÓÒß…µÄ echo •þ±»ˆÌÐУ¬…sÕýÊÇÒòžé×óß…µÄ test ËÍ»Ø·Ç 0 ËùÒýÆðµÄ¡£ ÊÂŒ?ÉÏ£¬ÎÒ‚ƒÔÚͬһÃüÁîÐÐÖУ¬¿ÉÓÃ¶à‚€ && »ò || ?í½M½¨ÄØ£º ´úÂë: $ A=123 $ [ -n "$A" ] && echo "yes! it's ture." || echo "no, it's NOT ture." yes! it's ture. $ unset A $ [ -n "$A" ] && echo "yes! it's ture." || echo "no, it's NOT ture." no, it's NOT ture. Ôõ˜Ó£¬?Äß@Ò»¿Ìé_ʼ£¬ÄãÊÇ·ñÓXµÃÎÒ‚ƒµÄ shell ÊÇ"ºÜ”Ã÷"µÄÄØ£¿ ^_^ ºÃÁË£¬×îáᣬ?ÑÖÃÒ»µÀÁ•î}½o´ó¼Ò×ö×ö¿´¡¢¡¢¡¢ ÏÂÃæµÄÅДàÊÇ£º®” $A ±»ÙxÅcÖµ•r£¬ÔÙ¿´ÊÇ·ñÐ¡ì¶ 100 £¬·ñ„tËͳö too big! £º ´úÂë: $ A=123 $ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!' too big! ÈôÎÒŒ¢ A È¡Ïû£¬ÕÕÀíÕf£¬‘ªÔ“²»•þËÍÎÄ×ֲŌ¦°¡(ÒòžéµÚÒ»‚€—l¼þ¾Í²»³ÉÁ¢ÁË)... ´úÂë: $ unset A $ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!' too big! žéºÎÉÏÃæµÄ½Y¹ûÒ²¿ÉµÃµ½ÄØ£¿ ÓÖ£¬ÈçºÎ½â›Q֮Ĩ£¿ (Ìáʾ£ºÐ޸ķ½·¨ºÜ¶à£¬ÆäÖÐÒ»·N·½·¨¿ÉÀûÓÃµÚÆßÕ½é½Bß^µÄ command group ...) ¿ì©u¸æÎÒÎҴ𰸩uÆäðNÃâÕ„.... 11) > Åc < ²îÔÚÄÄ£¿ ß@´ÎµÄî}Ŀ֮ǰÎÒÔÚ CU µÄ shell °æÒÑÕfÃ÷ß^ÁË£º <a href="http://bbs.chinaunix.net/forum/24/20031030/191375.html" target="_blank">http://bbs.chinaunix.net/forum/24/20031030/191375.html</a> ß@´ÎÎҾͲ»ÖØŒ‘ÁË£¬Œ¢ÙN×ӵăÈÈÝ"³"ÏÂ?í¾ÍÊÇÁË... -------------- 11.1 Õ„µ½ I/O redirection £¬²»·ÁÏÈ׌ÎÒ‚ƒÕJ×RһϠFile Descriptor (FD) ¡£ ³ÌʽµÄßË㣬Ôڴ󲿷ÝÇé›r϶¼ÊÇßMÐДµ“þ(data)µÄÌŽÀí£¬ ß@Щ”µ“þ?ÄÄÄ×xßM£¿ÓÖ£¬Ëͳöµ½ÄÄÑeÄØ£¿ ß@¾ÍÊÇ file descriptor (FD) µÄ¹¦ÓÃÁË¡£ ÔÚ shell ³ÌʽÖУ¬×ʹÓÃµÄ FD ´ó¸ÅÓÐÈý‚€£¬·Ö„ežé£º 0: Standard Input (STDIN) 1: Standard Output (STDOUT) 2: Standard Error Output (STDERR) Ôژ˜ÊÇé›rÏ£¬ß@Щ FD ·Ö„e¸úÈçÏÂÔO‚ä(device)êP“£º stdin(0): keyboard stdout(1): monitor stderr(2): monitor ÎÒ‚ƒ¿ÉÒÔÓÃÈçÏÂÏÂÃüÁîœyԇһϣº ´úÂë: $ mail -s test root this is a test mail. please skip. ^d (ͬ•r°´ crtl ¸ú d æI) ºÜÃ÷ï@£¬mail ³ÌʽËù×xßMµÄ”µ“þ£¬¾ÍÊÇ?Ä stdin Ò²¾ÍÊÇ keyboard ×xßMµÄ¡£ ²»ß^£¬²»ÒеÃÿ‚€³ÌʽµÄ stdin ¶¼¸ú mail Ò»˜Ó?Ä keyboard ×xßM£¬ Òòžé³Ìʽ×÷Õß¿ÉÒÔ?Ä™n°¸…¢”µ×xßM stdin £¬È磺 ´úÂë: $ cat /etc/passwd µ«£¬ÒªÊÇ cat Ö®áá›]ÓЙn°¸…¢”µ„tÓÖÈçºÎÄØ£¿ Ŷ£¬ÕˆÄú×Ô¼ºÍæÍæ¿´‡Ó.... ^_^ ´úÂë: $ cat (ÕˆÁôÒ┵“þÝ”³öµ½ÄÄÑeÈ¥ÁË£¬×îáá„eÍüÁ˰´ ^d ëxé_...) ÖÁì¶ stdout Åc stderr £¬àÅ... µÈÎÒÓпÕÔÙÀm°É... ^_^ ߀ÊÇ£¬ÓÐÄÄλǰ݅Ҫ?íÍæ½ÓýˆÄØ£¿ -------------- 11.2 ÑØÎÄÔÙÀm£¬•ø½ÓÉÏÒ»»Ø... ^_^ ÏàÐÅ£¬½›ß^ÉÏÒ»‚€¾šÁ•áᣬÄ㌦ stdin Åc stdout ‘ªÔ“²»ëyÀí½â°É£¿ È»áᣬ׌ÎÒ‚ƒÀ^Àm¿´ stderr ºÃÁË¡£ ÊÂŒ?ÉÏ£¬stderr ›]ÉõüNëyÀí½âµÄ£ºÕf´©Á˾ÍÊÇ"åeÕ`ÐÅÏ¢"ÒªÍùÄÄß…ËͶøÒÑ... ±È·½Õf£¬Èô×xßMµÄ™n°¸…¢”µÊDz»´æÔڵģ¬ÄÇÎÒ‚ƒÔÚ monitor ÉϾͿ´µ½ÁË£º ´úÂë: $ ls no.such.file ls: no.such.file: No such file or directory Èô£¬Ò»‚€ÃüÁîͬ•r®aÉú stdout Åc stderr ÄØ£¿ ÄÇ߀²»º††Î£¬¶¼Ë͵½ monitor ?í¾ÍºÃÁË£º ´úÂë: $ touch my.file $ ls my.file no.such.file ls: no.such.file: No such file or directory my.file okay£¬ÖÁ´Ë£¬êPì¶ FD ¼°ÆäÃû·Q¡¢ß€ÓÐÏàêP“µÄÔO‚䣬ÏàÐÅÄãÒѽ››]†–î}Á˰ɣ¿ ÄǺ㬽ÓÏÂ?í׌ÎÒ‚ƒ¿´¿´ÈçºÎ¸Ä׃ß@Щ FD µÄîAÔO”µ“þͨµÀ£¬ ÎÒ‚ƒ¿ÉÓà < ?í¸Ä׃×xßMµÄ”µ“þͨµÀ(stdin)£¬Ê¹Ö®?ÄÖ¸¶¨µÄ™n°¸×xßM¡£ ÎÒ‚ƒ¿ÉÓà > ?í¸Ä׃ËͳöµÄ”µ“þͨµÀ(stdout, stderr)£¬Ê¹Ö®Ý”³öµ½Ö¸¶¨µÄ™n°¸¡£ ±È·½Õf£º ´úÂë: $ cat < my.file ¾ÍÊÇ?Ä my.file ×xßM”µ“þ ´úÂë: $ mail -s test root < /etc/passwd „tÊÇ?Ä /etc/passwd ×xßM... ß@˜ÓÒ»?í£¬stdin Œ¢²»ÔÙÊÇ?Ä keyboard ×xßM£¬¶øÊÇ?Ä™n°¸×xßMÁË... ‡À¸ñ?íÕf£¬< ·û̖֮ǰÐèÒªÖ¸¶¨Ò»‚€ FD µÄ(Ö®ég²»ÄÜÓпհ×)£¬ µ«Òòžé 0 ÊÇ < µÄîAÔOÖµ£¬Òò´Ë < Åc 0< ÊÇÒ»˜ÓµÄ©u okay£¬ß@‚€ºÃÀí½â°É£¿ ÄÇ£¬ÒªÊÇÓÃɂ€ << ÓÖÊÇɶĨ£¿ ß@ÊÇËùÖ^µÄ HERE Document £¬Ëü¿ÉÒÔ׌ÎÒ‚ƒÝ”ÈëÒ»¶ÎÎı¾£¬Ö±µ½×xµ½ << ááÖ¸¶¨µÄ×Ö´®¡£ ±È·½Õf£º ´úÂë: $ cat <<FINISH first line here second line there third line nowhere FINISH ß@˜ÓµÄÔ’£¬cat •þ×xßM 3 Ðоä×Ó£¬¶øŸoÐè?Ä keyboard ×xßM”µ“þÇÒÒªµÈ ^d ½YÊøÝ”Èë¡£ ÖÁì¶ > ÓÖÈçºÎÄØ£¿ ÇÒ Ï»طֽâ.... -------------- 11.3 okay£¬ÓÖµ½Öv¹Å•rég~~~ ®”Äã¸ã¶®ÁË 0< Ô?í¾ÍÊǸÄ׃ stdin µÄ”µ“þÝ”ÈëͨµÀÖ®áᣬÏàÐÅÒªÀí½âÈçσɂ€ redirection ¾Í²»ëyÁË£º * 1> * 2> ǰÕßÊǸÄ׃ stdout µÄ”µ“þÝ”³öͨµÀ£¬ááÕßÊǸÄ׃ stderr µÄ”µ“þÝ”³öͨµÀ¡£ ƒÉÕß¶¼ÊÇŒ¢Ô±¾ÒªËͳöµ½ monitor µÄ”µ“þÞDÏòÝ”³öµ½Ö¸¶¨™n°¸È¥¡£ ÓÉì¶ 1 ÊÇ > µÄîAÔOÖµ£¬Òò´Ë£¬1> Åc > ÊÇÏàͬµÄ£¬¶¼ÊÇ¸Ä stdout ¡£ ÓÃÉÏ´ÎµÄ ls Àý×Ó?íÕfÃ÷һϺÃÁË£º ´úÂë: $ ls my.file no.such.file 1>file.out ls: no.such.file: No such file or directory ß@˜Ó monitor ¾ÍֻʣÏ stderr ¶øÒÑ¡£Òòžé stdout ½oŒ‘ßM file.out È¥ÁË¡£ ´úÂë: $ ls my.file no.such.file 2>file.err my.file ß@˜Ó monitor ¾ÍֻʣÏ stdout £¬Òòžé stderr Œ‘ßMÁË file.err ¡£ ´úÂë: $ ls my.file no.such.file 1>file.out 2>file.err ß@˜Ó monitor ¾ÍɶҲ›]ÓУ¬Òòžé stdout Åc stderr ¶¼½oÞDµ½™n°¸È¥ÁË... ºÇ~~~ ¿´?íÒªÀí½â > Ò»ücÒ²²»ëyÀ²©uÊDz»£¿›]ò_Äã°É£¿ ^_^ ²»ß^£¬ÓÐЩµØ·½ß€ÊÇҪעÒâһϵġ£ Ê×ÏÈ£¬ÊÇ file locking µÄ†–î}¡£±È·½ÈçÏÂß@‚€Àý×Ó£º ´úÂë: $ ls my.file no.such.file 1>file.both 2>file.both ?Ä file system µÄ½Ç¶È?íÕf£¬†ÎÒ»™n°¸ÔÚ†ÎÒ»•régƒÈ£¬Ö»Äܱ»†ÎÒ»µÄ FD ×÷Œ‘Èë¡£ ¼ÙÈç stdout(1) Åc stderr(2) ¶¼Í¬•rÔÚŒ‘Èë file.both µÄÔ’£¬ „tÒª¿´Ëü‚ƒÔÚŒ‘Èë•r·ñÅöµ½Í¬•r¸‚ ޵ÄÇéÐÎÁË£¬»ù±¾ÉÏÊÇ"ÏÈ“ŒÏÈÚA"µÄÔ„t¡£ ׌ÎÒ‚ƒÓÃÖÜÐÇñYʽµÄ"ÂýçRî^"?í¿´Ò»Ï stdout Åc stderr ͬ•rŒ‘Èë file.out µÄÇéÐκÃÁË£º * µÚ 1, 2, 3 Ãëžé stdout Œ‘Èë * µÚ 3, 4, 5 Ãëžé stderr Œ‘Èë ÄÇüN£¬ß@•rºò stderr µÄµÚ 3 ÃëËùŒ‘µÄ”µ“þ¾Í?GʧµôÁË©u ÒªÊÇÎÒ‚ƒÄÜ¿ØÖÆ stderr ±ØíšµÈ stdout Œ‘ÍêÔÙŒ‘£¬»òµ¹ß^?í£¬stdout µÈ stderr Œ‘ÍêÔÙŒ‘£¬Ädž–î}¾ÍÄܽâ›Q¡£ µ«?ļ¼ÐgÉÏ£¬Ý^ëyÕÆ¿ØµÄ£¬ÓÈÆäÊÇ FD ÔÚ×÷"éLÆÚÐÔ"µÄŒ‘Èë•r... ÄÇ£¬ÈçºÎ½â›QÄØ£¿ËùÖ^ɽ²»ÞD·ÞD¡¢Â·²»ÞDÈËÞDÂ ÎÒ‚ƒ¿ÉÒÔ“QÒ»‚€Ë¼¾S£ºŒ¢ stderr Œ§ßM stdout »òŒ¢ stdout Œ§ßM sterr £¬¶ø²»ÊÇ´ó¼ÒÔÚ“ŒÍ¬Ò»·Ý™n°¸£¬²»¾ÍÐÐÁË©u bingo©u¾ÍÊÇß@˜ÓÀ²£º * 2>&1 ¾ÍÊÇŒ¢ stderr ?ãßM stdout ×÷Ý”³ö * 1>&2 »ò >&2 ¾ÍÊÇŒ¢ stdout ?ãßM stderr ×÷Ý”³ö ì¶ÊÇ£¬Ç°ÃæµÄåeÕ`²Ù×÷¿ÉÒԸĞ飺 ´úÂë: $ ls my.file no.such.file 1>file.both 2>&1 »ò $ ls my.file no.such.file 2>file.both >&2 ß@˜Ó£¬²»¾Í½Ô´óšgϲÁˆ᣿ ºÇ~~~ ^_^ ²»ß^£¬¹â½â›QÁË locking µÄ†–î}߀²»‰ò£¬ÎÒ‚ƒß€ÓÐÆäËû¼¼ÇÉÐèÒªÁ˽âµÄ¡£ ¹ÊÊÂ߀›]½YÊø£¬„e×ßé_©u?V¸æáᣬÎÒ‚ƒÔÙ»Ø?í...©u -------------- 11.4 okay£¬ß@´Î²»Öv I/O Redirction £¬Öv·ð°É... (ÓЛ]¸ãåe£¿©u¾WÖÐÈËÊÇ·ñî^š¤Ÿý‰ÄÁË£¿...) Îû~~~ ^_^ ŒW·ðµÄ×î¸ß¾³½ç£¬¾ÍÊÇ"ËÄ´ó½Ô¿Õ"¡£ÖÁì¶ÊÇ¿ÕÄÄËÄ´ó‰K£¿ÎÒÒ²²»Öª£¬ÒòžéÎÒ߀›]µ½ÄǾ³½ç... µ«ß@‚€"¿Õ"×Ö£¬…s·Ç³£ÖµµÃÎÒ‚ƒ·µÑ}°ÑÍæµÄ£º --- É«¼´Êǿա¢¿Õ¼´ÊÇÉ«©u ºÃÁË£¬Ê©Ö÷ÒªÊÇÄ܉òîI•þ"¿Õ"µÄ¶UÒ⣬ÄÇëxÐÞ³ÉÕý¹û²»ßhÒÓ~~~ ÔÚ Linux ™n°¸Ïµ½yÑe£¬ÓЂ€ÔO‚ä™nÎ»ì¶ /dev/null ¡£ ÔS¶àÈ˶¼†–ß^ÎÒÄÇÊÇÉõüNÍæÒ⃺£¿ÎÒ¸úÄãÕfºÃÁË£ºÄǾÍÊÇ"¿Õ"À²©u ›]åe©u¿Õ¿ÕÈçÒ²µÄ¿Õ¾ÍÊÇ null ÁË.... Õˆ†–Ê©Ö÷ÊÇ·ñºöÈ»ÓÐËùîDÕ`ÁËÄØ£¿È»„t¹§Ï²ÁË~~~ ^_^ ß@‚€ null ÔÚ I/O Redirection ÖпÉÓÐÓõúÜÄØ£º * ÈôŒ¢ FD1 ¸ú FD2 ÞDµ½ /dev/null È¥£¬¾Í¿ÉŒ¢ stdout Åc stderr Ū²»Òеô¡£ * ÈôŒ¢ FD0 ½Óµ½ /dev/null ?í£¬ÄǾÍÊÇ×xßM nothing ¡£ ±È·½Õf£¬®”ÎÒ‚ƒÔÚˆÌÐÐÒ»‚€³Ìʽ•r£¬®‹Ãæ•þͬ•rËͳö stdout ¸ú stderr £¬ ¼ÙÈçÄã²»Ïë¿´µ½ stderr (Ò²²»Ïë´æµ½™n°¸È¥)£¬ÄÇ¿ÉÒÔ£º ´úÂë: $ ls my.file no.such.file 2>/dev/null my.file ÈôÒªÏà·´£ºÖ»Ïë¿´µ½ stderr ÄØ£¿ß€²»º††Î©uŒ¢ stdout Ūµ½ null ¾ÍÐУº ´úÂë: $ ls my.file no.such.file >/dev/null ls: no.such.file: No such file or directory ÄǽÓÏÂ?í£¬¼ÙÈç†Î¼ƒÖ»ÅܳÌʽ£¬²»Ïë¿´µ½ÈκÎÝ”³ö½Y¹ûÄØ£¿ Ŷ£¬ß@ÑeÁôÁËÒ»ÊÖÉϴι?Ä¿›]ÖvµÄ·¨×Ó£¬Œ£éTÙ›ÓèÓо‰ÈË©u... ^_^ ³ýÁËÓà >/dev/null 2>&1 Ö®Í⣬Äã߀¿ÉÒÔÈç´Ë£º ´úÂë: $ ls my.file no.such.file &>/dev/null (Ìáʾ£ºŒ¢ &> “Q³É >& Ò²ÐÐÀ²~~! ) okay£¿ÖvÍê·ð£¬½ÓÏÂ?í£¬ÔÙ׌ÎÒ‚ƒ¿´¿´ÈçÏÂÇé›r£º ´úÂë: $ echo "1" > file.out $ cat file.out 1 $ echo "2" > file.out $ cat file.out 2 ¿´?í£¬ÎÒ‚ƒÔÚÖØŒ§ stdout »ò stderr ßMÒ»·Ý™n°¸•r£¬ËƺõÓÀßhÖ»«@µÃ×îááÒ»´ÎŒ§ÈëµÄ½Y¹û¡£ ÄÇ£¬Ö®Ç°µÄƒÈÈÝÄØ£¿ ºÇ~~~ Òª½â›Qß@‚€†–ÌáºÜº††ÎÀ²£¬Œ¢ > “Q³É >> ¾ÍºÃ£º ´úÂë: $ echo "3" >> file.out $ cat file.out 2 3 Èç´ËÒ»?í£¬±»ÖØŒ§µÄÄ¿˜Ë™n°¸Ö®ƒÈÈÝ?K²»•þʧȥ£¬¶øÐµăÈÈÝ„tÒ»Ö±Ôö¼ÓÔÚ×îááÃæÈ¥¡£ easy £¿ ºÇ ... ^_^ µ«£¬Ö»ÒªÄãÔÙÒ»´ÎÓû؆ÎÒ»µÄ > ?íÖØŒ§µÄÔ’£¬ÄÇüN£¬ÅfµÄƒÈÈÝ߀ÊÇ•þ±»"Ï´"µôµÄ©u ß@•r£¬ÄãÒªÈçºÎ±ÜÃâÄØ£¿ ----‚ä·Ý©u yes £¬ÎÒ µ½ÁË©u²»ß^.... ߀ÓиüºÃµÄ†á£¿ ¼ÈÈ»ÅcÊ©Ö÷ß@üNÓо‰·Ý£¬Àϼ{¾ÍËÍÄãÒ»‚€åÄÒÃî·¨°É£º ´úÂë: $ set -o noclobber $ echo "4" > file.out -bash: file: cannot overwrite existing file ÄÇ£¬ÒªÈçºÎÈ¡Ïûß@‚€"ÏÞÖÆ"ÄØ£¿ Ŷ£¬Œ¢ set -o “Q³É set +o ¾ÍÐУº ´úÂë: $ set +o noclobber $ echo "5" > file.out $ cat file.out 5 ÔÙ†–£ºÄÇ... ÓÐÞk·¨²»È¡Ïû¶øÓÖ"ÅR•r"ÉwŒ‘Ä¿˜Ë™n°¸†á£¿ Ŷ£¬·ðÔ»£º²»¿É¸æÒ²©u °¡~~~ é_ÍæÐ¦µÄ¡¢é_ÍæÐ¦µÄÀ²~~~ ^_^ °¦£¬Ôç¾ÍÁϵ½ÈËÐÄÊDz»×ãµÄÁË©u ´úÂë: $ set -o noclobber $ echo "6" >| file.out $ cat file.out 6 ÁôÒâµ½›]ÓУºÔÚ > ááÃæÔÙ¼Ó‚€" | "¾ÍºÃ(×¢Ò⣺ > Åc | Ö®ég²»ÄÜÓпհ×Ŷ).... ºô.... (ÉîºôÎüͼ{һϰÉ)~~~ ^_^ ÔÙ?í߀ÓÐÒ»‚€ëyî}ÒªÄãÈ¥…¢Í¸µÄÄØ£º ´úÂë: $ echo "some text here" > file $ cat < file some text here $ cat < file > file.bak $ cat < file.bak some text here $ cat < file > file $ cat < file àÅ£¿©u×¢Òâµ½›]ÓУ¿©u©u ---- ÔõüN×îááÄÇ‚€ cat ÃüÁî¿´µ½µÄ file ¾¹Êǿյģ¿©u why? why? why? ͬŒW‚ƒ£ºÏ¹?Õn²»Òªßtµ½‡Ó~~~! -------------- 11.5 ‡Ž‡Ž‡Ž~~~ ÉÏÕn‡Ó~~~ ^_^ Ç°ÃæÌáµ½£º$ cat < file > file Ö®ááÔ±¾ÓЃÈÈݵęn°¸½Y¹û…s±»Ï´µôÁË©u ÒªÀí½âß@Ò»¬FÏñÆäŒ?²»ëy£¬ß@Ö»ÊÇ priority µÄ†–î}¶øÒÑ£º * ÔÚ IO Redirection ÖУ¬stdout Åc stderr µÄ¹ÜµÀ•þÏȜʂäºÃ£¬²Å•þ?Ä stdin ×xßMÙYÁÏ¡£ Ò²¾ÍÊÇÕf£¬ÔÚÉÏÀýÖУ¬> file •þÏÈŒ¢ file Çå¿Õ£¬È»áá²Å×xßM < file £¬ µ«ß@•rºò™n°¸Òѽ›±»Çå¿ÕÁË£¬Òò´Ë¾Í׃³É×x²»ßMÈκÎÙYÁÏÁË... Ŷ~~~ Ô?íÈç´Ë~~~~ ^_^ ÄÇ... ÈçσÉÀýÓÖÈçºÎÄØ£¿ ´úÂë: $ cat <> file $ cat < file >> file àÅ... ͬŒW‚ƒ£¬ß@ƒÉ‚€´ð°¸¾Í®”¾šÁ•î}‡Ó£¬Ï¹?Õn֮ǰՈ½»×÷˜I©u ºÃÁË£¬I/O Redirection Ò²¿ìÖvÍêÁË£¬sorry£¬ÒòžéÎÒÒ²Ö»ÖªµÀß@üN¶à¶øÒÑÀ²~~~ Îû~~ ^_^ ²»ß^£¬ß€ÓÐÒ»˜Ó–|–|ÊÇÒ»¶¨ÒªÖvµÄ£¬¸÷λÓ^±Š(Õˆ×ÔÐÐÅ䘷~!#@!$%) £º ---- ¾ÍÊÇ pipe line Ò²©u Õ„µ½ pipe line £¬ÎÒÏàÐŲ»ÉÙÈ˶¼²»•þİÉú£º ÎÒ‚ƒÔںܶà command line Éϳ£¿´µ½µÄ" | "·ûÌ–¾ÍÊÇ pipe line ÁË¡£ ²»ß^£¬¾¿¾¹ pipe line ÊÇÉõüN–|–|ÄØ£¿ „e¼±„e¼±... ÏȲéÒ»ÏÂÓ¢?h×ֵ䣬¿´¿´ pipe ÊÇÉõüNÒâ˼£¿ ›]åe©uËü¾ÍÊÇ"Ë®¹Ü"µÄÒâ˼... ÄÇüN£¬ÄãÄÜÏëÏñÒ»ÏÂË®¹ÜÊÇÔõüNÒ»¸ù½ÓÖøÒ»¸ùµÄ†á£¿ ÓÖ£¬Ã¿¸ùË®¹ÜÖ®égµÄ input ¸ú output ÓÖÈçºÎÄØ£¿ àÅ£¿£¿ ì`¹âÒ»éW£ºÔ?í pipe line µÄ I/O ¸úË®¹ÜµÄ I/O ÊÇһģһ˜ÓµÄ£º * ÉÏÒ»‚€ÃüÁîµÄ stdout ½Óµ½ÏÂÒ»‚€ÃüÁîµÄ stdin È¥ÁË©u µÄ´_Èç´Ë... ²»¹ÜÔÚ command line ÉÏÄãʹÓÃÁ˶àÉÙ‚€ pipe line £¬ ǰááƒÉ‚€ command µÄ I/O ¶¼ÊDZ˴ËßB½ÓµÄ©u(¹§Ï²£ºÄã½Kì¶é_¸[ÁË©u ^_^ ) ²»ß^... È»¶ø... µ«ÊÇ... ... stderr ÄØ£¿ ºÃ†–î}©u²»ß^Ò²ÈÝÒ×Àí½â£º * ÈôË®¹Ü©ˮÔõüNÞk£¿ Ò²¾ÍÊÇÕf£ºÔÚ pipe line Ö®ég£¬Ç°Ò»‚€ÃüÁîµÄ stderr ÊDz»•þ½ÓßMÏÂÒ»ÃüÁîµÄ stdin µÄ£¬ ÆäÝ”³ö£¬Èô²»Óà 2> Œ§µ½ file È¥µÄÔ’£¬Ëü߀ÊÇË͵½±OÒ•Æ÷ÉÏÃæ?í©u ß@ücÕˆÄãÔÚ pipe line ßÓÃÉτձØÒª×¢ÒâµÄ¡£ ÄÇ£¬»òÔSÄãÓÖ•þ†–£º * ÓÐÞk·¨Œ¢ stderr Ò²ðjßMÏÂÒ»‚€ÃüÁîµÄ stdin È¥†á£¿ (Ø?µÃŸo…’µÄ¼Òâ·©u) ·½·¨®”È»ÊÇÓУ¬¶øÇÒÄãÔçÒÑŒWß^ÁË©u ^_^ ÎÒÌáʾһϾͺ㺠* Õˆ†–ÄãÈçºÎŒ¢ stderr ºÏ?ãßM stdout һͬݔ³öÄØ£¿ ÈôÄã´ð²»³ö?í£¬ÏÂÕnÖ®ááÔÙ?톖ÎÒ°É... (Èç¹ûÄãÄ˜Æ¤Õæ‰òºñµÄÔ’...) »òÔS£¬ÄãÈÔÒâÓÈδ±M©u»òÔS£¬ÄãÔø½›Åöµ½ß^ÏÂÃæµÄ†–î}£º * ÔÚ cm1 | cm2 | cm3 ... ß@¶Î pipe line ÖУ¬ÈôÒªŒ¢ cm2 µÄ½Y¹û´æµ½Ä³Ò»™n°¸ÄØ£¿ ÈôÄ㌑³É cm1 | cm2 > file | cm3 µÄÔ’£¬ ÄÇÄã¿Ï¶¨•þ°l¬F cm3 µÄ stdin Êǿյĩu(®”È»À²£¬Äã¶¼Œ¢Ë®¹Ü½Óµ½„eµÄË®³ØÁË©u) ”Ã÷µÄÄã»òÔS•þÈç´Ë½â›Q£º ´úÂë: cm1 | cm2 > file ; cm3 < file Êǵģ¬ÄãµÄ´_¿ÉÒÔß@˜Ó×ö£¬µ«×î´óµÄ‰ÄÌŽÊÇ£ºß@˜ÓÒ»?í£¬file I/O •þ׃ëp±¶©u ÔÚ command ˆÌÐеÄÕû‚€ß^³ÌÖУ¬file I/O ÊÇ×î³£ÒŠµÄ×î´óЧÄÜš¢ÊÖ¡£ ·²ÊÇÓн›òžµÄ shell ²Ù×÷Õߣ¬¶¼•þ±MÁ¿±ÜÃâ»ò½µµÍ file I/O µÄîlÂÊ¡£ ÄÇ£¬ÉÏÃæ†–î}߀ÓиüºÃ·½·¨†á£¿ Óеģ¬ÄǾÍÊÇ tee ÃüÁîÁË¡£ * ËùÖ^ tee ÃüÁîÊÇÔÚ²»Ó°í‘Ô±¾ I/O µÄÇé›rÏ£¬Œ¢ stdout Ñ}ÑuÒ»·Ýµ½™n°¸È¥¡£ Òò´Ë£¬ÉÏÃæµÄÃüÁîÐпÉÒÔÈç´Ë´ò£º ´úÂë: cm1 | cm2 | tee file | cm3 ÔÚîAÔOÉÏ£¬tee •þ¸ÄŒ‘Ä¿˜Ë™n°¸£¬ÈôÄãÒª¸ÄžéÔö¼ÓƒÈÈݵÄÔ’£¬ÄÇ¿ÉÓà -a …¢”µß_³É¡£ »ù±¾ÉÏ£¬pipe line µÄ‘ªÓÃÔÚ shell ²Ù×÷ÉÏÊǷdz£?V·ºµÄ£¬ÓÈÆäÊÇÔÚ text filtering ·½Ã棬 ·²Åe cat, more, head, tail, wc, expand, tr, grep, sed, awk, ... µÈµÈÎÄ×ÖÌŽÀí¹¤¾ß£¬ ´îÅäÆð pipe line ?íʹÓã¬Äã•þó@ÓX command line Ô?íÊÇ»îµÃÈç´Ë¾«²ÊµÄ©u ³£×ŒÈËÓÐ"±ŠÑeŒ¤Ëûǧ°Ù¶È£¬ò‡È»»ØÊ×£¬ÄÇÈË…sÔÚŸô»ðê@ɺ̎©u"Ö®¸Ð... ^_^ .... ºÃÁË£¬êPì¶ I/O Redirection µÄ½é½B¾Íµ½´Ë¸æÒ»¶ÎÂä¡£ ÈôÈÕááÓпյÄÔ’£¬ÔÙžé´ó¼Ò½é½BÆäËüÔÚ shell ÉϺÃÍæµÄ–|Î÷©ubye... ^_^ 11) > Åc < ²îÔÚÄÄ£¿ ß@´ÎµÄî}Ŀ֮ǰÎÒÔÚ CU µÄ shell °æÒÑÕfÃ÷ß^ÁË£º <a href="http://bbs.chinaunix.net/forum/24/20031030/191375.html" target="_blank">http://bbs.chinaunix.net/forum/24/20031030/191375.html</a> ß@´ÎÎҾͲ»ÖØŒ‘ÁË£¬Œ¢ÙN×ӵăÈÈÝ"³"ÏÂ?í¾ÍÊÇÁË... -------------- 11.1 Õ„µ½ I/O redirection £¬²»·ÁÏÈ׌ÎÒ‚ƒÕJ×RһϠFile Descriptor (FD) ¡£ ³ÌʽµÄßË㣬Ôڴ󲿷ÝÇé›r϶¼ÊÇßMÐДµ“þ(data)µÄÌŽÀí£¬ ß@Щ”µ“þ?ÄÄÄ×xßM£¿ÓÖ£¬Ëͳöµ½ÄÄÑeÄØ£¿ ß@¾ÍÊÇ file descriptor (FD) µÄ¹¦ÓÃÁË¡£ ÔÚ shell ³ÌʽÖУ¬×ʹÓÃµÄ FD ´ó¸ÅÓÐÈý‚€£¬·Ö„ežé£º 0: Standard Input (STDIN) 1: Standard Output (STDOUT) 2: Standard Error Output (STDERR) Ôژ˜ÊÇé›rÏ£¬ß@Щ FD ·Ö„e¸úÈçÏÂÔO‚ä(device)êP“£º stdin(0): keyboard stdout(1): monitor stderr(2): monitor ÎÒ‚ƒ¿ÉÒÔÓÃÈçÏÂÏÂÃüÁîœyԇһϣº ´úÂë: $ mail -s test root this is a test mail. please skip. ^d (ͬ•r°´ crtl ¸ú d æI) ºÜÃ÷ï@£¬mail ³ÌʽËù×xßMµÄ”µ“þ£¬¾ÍÊÇ?Ä stdin Ò²¾ÍÊÇ keyboard ×xßMµÄ¡£ ²»ß^£¬²»ÒеÃÿ‚€³ÌʽµÄ stdin ¶¼¸ú mail Ò»˜Ó?Ä keyboard ×xßM£¬ Òòžé³Ìʽ×÷Õß¿ÉÒÔ?Ä™n°¸…¢”µ×xßM stdin £¬È磺 ´úÂë: $ cat /etc/passwd µ«£¬ÒªÊÇ cat Ö®áá›]ÓЙn°¸…¢”µ„tÓÖÈçºÎÄØ£¿ Ŷ£¬ÕˆÄú×Ô¼ºÍæÍæ¿´‡Ó.... ^_^ ´úÂë: $ cat (ÕˆÁôÒ┵“þÝ”³öµ½ÄÄÑeÈ¥ÁË£¬×îáá„eÍüÁ˰´ ^d ëxé_...) ÖÁì¶ stdout Åc stderr £¬àÅ... µÈÎÒÓпÕÔÙÀm°É... ^_^ ߀ÊÇ£¬ÓÐÄÄλǰ݅Ҫ?íÍæ½ÓýˆÄØ£¿ -------------- 11.2 ÑØÎÄÔÙÀm£¬•ø½ÓÉÏÒ»»Ø... ^_^ ÏàÐÅ£¬½›ß^ÉÏÒ»‚€¾šÁ•áᣬÄ㌦ stdin Åc stdout ‘ªÔ“²»ëyÀí½â°É£¿ È»áᣬ׌ÎÒ‚ƒÀ^Àm¿´ stderr ºÃÁË¡£ ÊÂŒ?ÉÏ£¬stderr ›]ÉõüNëyÀí½âµÄ£ºÕf´©Á˾ÍÊÇ"åeÕ`ÐÅÏ¢"ÒªÍùÄÄß…ËͶøÒÑ... ±È·½Õf£¬Èô×xßMµÄ™n°¸…¢”µÊDz»´æÔڵģ¬ÄÇÎÒ‚ƒÔÚ monitor ÉϾͿ´µ½ÁË£º ´úÂë: $ ls no.such.file ls: no.such.file: No such file or directory Èô£¬Ò»‚€ÃüÁîͬ•r®aÉú stdout Åc stderr ÄØ£¿ ÄÇ߀²»º††Î£¬¶¼Ë͵½ monitor ?í¾ÍºÃÁË£º ´úÂë: $ touch my.file $ ls my.file no.such.file ls: no.such.file: No such file or directory my.file okay£¬ÖÁ´Ë£¬êPì¶ FD ¼°ÆäÃû·Q¡¢ß€ÓÐÏàêP“µÄÔO‚䣬ÏàÐÅÄãÒѽ››]†–î}Á˰ɣ¿ ÄǺ㬽ÓÏÂ?í׌ÎÒ‚ƒ¿´¿´ÈçºÎ¸Ä׃ß@Щ FD µÄîAÔO”µ“þͨµÀ£¬ ÎÒ‚ƒ¿ÉÓà < ?í¸Ä׃×xßMµÄ”µ“þͨµÀ(stdin)£¬Ê¹Ö®?ÄÖ¸¶¨µÄ™n°¸×xßM¡£ ÎÒ‚ƒ¿ÉÓà > ?í¸Ä׃ËͳöµÄ”µ“þͨµÀ(stdout, stderr)£¬Ê¹Ö®Ý”³öµ½Ö¸¶¨µÄ™n°¸¡£ ±È·½Õf£º ´úÂë: $ cat < my.file ¾ÍÊÇ?Ä my.file ×xßM”µ“þ ´úÂë: $ mail -s test root < /etc/passwd „tÊÇ?Ä /etc/passwd ×xßM... ß@˜ÓÒ»?í£¬stdin Œ¢²»ÔÙÊÇ?Ä keyboard ×xßM£¬¶øÊÇ?Ä™n°¸×xßMÁË... ‡À¸ñ?íÕf£¬< ·û̖֮ǰÐèÒªÖ¸¶¨Ò»‚€ FD µÄ(Ö®ég²»ÄÜÓпհ×)£¬ µ«Òòžé 0 ÊÇ < µÄîAÔOÖµ£¬Òò´Ë < Åc 0< ÊÇÒ»˜ÓµÄ©u okay£¬ß@‚€ºÃÀí½â°É£¿ ÄÇ£¬ÒªÊÇÓÃɂ€ << ÓÖÊÇɶĨ£¿ ß@ÊÇËùÖ^µÄ HERE Document £¬Ëü¿ÉÒÔ׌ÎÒ‚ƒÝ”ÈëÒ»¶ÎÎı¾£¬Ö±µ½×xµ½ << ááÖ¸¶¨µÄ×Ö´®¡£ ±È·½Õf£º ´úÂë: $ cat <<FINISH first line here second line there third line nowhere FINISH ß@˜ÓµÄÔ’£¬cat •þ×xßM 3 Ðоä×Ó£¬¶øŸoÐè?Ä keyboard ×xßM”µ“þÇÒÒªµÈ ^d ½YÊøÝ”Èë¡£ ÖÁì¶ > ÓÖÈçºÎÄØ£¿ ÇÒ Ï»طֽâ.... -------------- 11.3 okay£¬ÓÖµ½Öv¹Å•rég~~~ ®”Äã¸ã¶®ÁË 0< Ô?í¾ÍÊǸÄ׃ stdin µÄ”µ“þÝ”ÈëͨµÀÖ®áᣬÏàÐÅÒªÀí½âÈçσɂ€ redirection ¾Í²»ëyÁË£º * 1> * 2> ǰÕßÊǸÄ׃ stdout µÄ”µ“þÝ”³öͨµÀ£¬ááÕßÊǸÄ׃ stderr µÄ”µ“þÝ”³öͨµÀ¡£ ƒÉÕß¶¼ÊÇŒ¢Ô±¾ÒªËͳöµ½ monitor µÄ”µ“þÞDÏòÝ”³öµ½Ö¸¶¨™n°¸È¥¡£ ÓÉì¶ 1 ÊÇ > µÄîAÔOÖµ£¬Òò´Ë£¬1> Åc > ÊÇÏàͬµÄ£¬¶¼ÊÇ¸Ä stdout ¡£ ÓÃÉÏ´ÎµÄ ls Àý×Ó?íÕfÃ÷һϺÃÁË£º ´úÂë: $ ls my.file no.such.file 1>file.out ls: no.such.file: No such file or directory ß@˜Ó monitor ¾ÍֻʣÏ stderr ¶øÒÑ¡£Òòžé stdout ½oŒ‘ßM file.out È¥ÁË¡£ ´úÂë: $ ls my.file no.such.file 2>file.err my.file ß@˜Ó monitor ¾ÍֻʣÏ stdout £¬Òòžé stderr Œ‘ßMÁË file.err ¡£ ´úÂë: $ ls my.file no.such.file 1>file.out 2>file.err ß@˜Ó monitor ¾ÍɶҲ›]ÓУ¬Òòžé stdout Åc stderr ¶¼½oÞDµ½™n°¸È¥ÁË... ºÇ~~~ ¿´?íÒªÀí½â > Ò»ücÒ²²»ëyÀ²©uÊDz»£¿›]ò_Äã°É£¿ ^_^ ²»ß^£¬ÓÐЩµØ·½ß€ÊÇҪעÒâһϵġ£ Ê×ÏÈ£¬ÊÇ file locking µÄ†–î}¡£±È·½ÈçÏÂß@‚€Àý×Ó£º ´úÂë: $ ls my.file no.such.file 1>file.both 2>file.both ?Ä file system µÄ½Ç¶È?íÕf£¬†ÎÒ»™n°¸ÔÚ†ÎÒ»•régƒÈ£¬Ö»Äܱ»†ÎÒ»µÄ FD ×÷Œ‘Èë¡£ ¼ÙÈç stdout(1) Åc stderr(2) ¶¼Í¬•rÔÚŒ‘Èë file.both µÄÔ’£¬ „tÒª¿´Ëü‚ƒÔÚŒ‘Èë•r·ñÅöµ½Í¬•r¸‚ ޵ÄÇéÐÎÁË£¬»ù±¾ÉÏÊÇ"ÏÈ“ŒÏÈÚA"µÄÔ„t¡£ ׌ÎÒ‚ƒÓÃÖÜÐÇñYʽµÄ"ÂýçRî^"?í¿´Ò»Ï stdout Åc stderr ͬ•rŒ‘Èë file.out µÄÇéÐκÃÁË£º * µÚ 1, 2, 3 Ãëžé stdout Œ‘Èë * µÚ 3, 4, 5 Ãëžé stderr Œ‘Èë ÄÇüN£¬ß@•rºò stderr µÄµÚ 3 ÃëËùŒ‘µÄ”µ“þ¾Í?GʧµôÁË©u ÒªÊÇÎÒ‚ƒÄÜ¿ØÖÆ stderr ±ØíšµÈ stdout Œ‘ÍêÔÙŒ‘£¬»òµ¹ß^?í£¬stdout µÈ stderr Œ‘ÍêÔÙŒ‘£¬Ädž–î}¾ÍÄܽâ›Q¡£ µ«?ļ¼ÐgÉÏ£¬Ý^ëyÕÆ¿ØµÄ£¬ÓÈÆäÊÇ FD ÔÚ×÷"éLÆÚÐÔ"µÄŒ‘Èë•r... ÄÇ£¬ÈçºÎ½â›QÄØ£¿ËùÖ^ɽ²»ÞD·ÞD¡¢Â·²»ÞDÈËÞDÂ ÎÒ‚ƒ¿ÉÒÔ“QÒ»‚€Ë¼¾S£ºŒ¢ stderr Œ§ßM stdout »òŒ¢ stdout Œ§ßM sterr £¬¶ø²»ÊÇ´ó¼ÒÔÚ“ŒÍ¬Ò»·Ý™n°¸£¬²»¾ÍÐÐÁË©u bingo©u¾ÍÊÇß@˜ÓÀ²£º * 2>&1 ¾ÍÊÇŒ¢ stderr ?ãßM stdout ×÷Ý”³ö * 1>&2 »ò >&2 ¾ÍÊÇŒ¢ stdout ?ãßM stderr ×÷Ý”³ö ì¶ÊÇ£¬Ç°ÃæµÄåeÕ`²Ù×÷¿ÉÒԸĞ飺 ´úÂë: $ ls my.file no.such.file 1>file.both 2>&1 »ò $ ls my.file no.such.file 2>file.both >&2 ß@˜Ó£¬²»¾Í½Ô´óšgϲÁˆ᣿ ºÇ~~~ ^_^ ²»ß^£¬¹â½â›QÁË locking µÄ†–î}߀²»‰ò£¬ÎÒ‚ƒß€ÓÐÆäËû¼¼ÇÉÐèÒªÁ˽âµÄ¡£ ¹ÊÊÂ߀›]½YÊø£¬„e×ßé_©u?V¸æáᣬÎÒ‚ƒÔÙ»Ø?í...©u -------------- 11.4 okay£¬ß@´Î²»Öv I/O Redirction £¬Öv·ð°É... (ÓЛ]¸ãåe£¿©u¾WÖÐÈËÊÇ·ñî^š¤Ÿý‰ÄÁË£¿...) Îû~~~ ^_^ ŒW·ðµÄ×î¸ß¾³½ç£¬¾ÍÊÇ"ËÄ´ó½Ô¿Õ"¡£ÖÁì¶ÊÇ¿ÕÄÄËÄ´ó‰K£¿ÎÒÒ²²»Öª£¬ÒòžéÎÒ߀›]µ½ÄǾ³½ç... µ«ß@‚€"¿Õ"×Ö£¬…s·Ç³£ÖµµÃÎÒ‚ƒ·µÑ}°ÑÍæµÄ£º --- É«¼´Êǿա¢¿Õ¼´ÊÇÉ«©u ºÃÁË£¬Ê©Ö÷ÒªÊÇÄ܉òîI•þ"¿Õ"µÄ¶UÒ⣬ÄÇëxÐÞ³ÉÕý¹û²»ßhÒÓ~~~ ÔÚ Linux ™n°¸Ïµ½yÑe£¬ÓЂ€ÔO‚ä™nÎ»ì¶ /dev/null ¡£ ÔS¶àÈ˶¼†–ß^ÎÒÄÇÊÇÉõüNÍæÒ⃺£¿ÎÒ¸úÄãÕfºÃÁË£ºÄǾÍÊÇ"¿Õ"À²©u ›]åe©u¿Õ¿ÕÈçÒ²µÄ¿Õ¾ÍÊÇ null ÁË.... Õˆ†–Ê©Ö÷ÊÇ·ñºöÈ»ÓÐËùîDÕ`ÁËÄØ£¿È»„t¹§Ï²ÁË~~~ ^_^ ß@‚€ null ÔÚ I/O Redirection ÖпÉÓÐÓõúÜÄØ£º * ÈôŒ¢ FD1 ¸ú FD2 ÞDµ½ /dev/null È¥£¬¾Í¿ÉŒ¢ stdout Åc stderr Ū²»Òеô¡£ * ÈôŒ¢ FD0 ½Óµ½ /dev/null ?í£¬ÄǾÍÊÇ×xßM nothing ¡£ ±È·½Õf£¬®”ÎÒ‚ƒÔÚˆÌÐÐÒ»‚€³Ìʽ•r£¬®‹Ãæ•þͬ•rËͳö stdout ¸ú stderr £¬ ¼ÙÈçÄã²»Ïë¿´µ½ stderr (Ò²²»Ïë´æµ½™n°¸È¥)£¬ÄÇ¿ÉÒÔ£º ´úÂë: $ ls my.file no.such.file 2>/dev/null my.file ÈôÒªÏà·´£ºÖ»Ïë¿´µ½ stderr ÄØ£¿ß€²»º††Î©uŒ¢ stdout Ūµ½ null ¾ÍÐУº ´úÂë: $ ls my.file no.such.file >/dev/null ls: no.such.file: No such file or directory ÄǽÓÏÂ?í£¬¼ÙÈç†Î¼ƒÖ»ÅܳÌʽ£¬²»Ïë¿´µ½ÈκÎÝ”³ö½Y¹ûÄØ£¿ Ŷ£¬ß@ÑeÁôÁËÒ»ÊÖÉϴι?Ä¿›]ÖvµÄ·¨×Ó£¬Œ£éTÙ›ÓèÓо‰ÈË©u... ^_^ ³ýÁËÓà >/dev/null 2>&1 Ö®Í⣬Äã߀¿ÉÒÔÈç´Ë£º ´úÂë: $ ls my.file no.such.file &>/dev/null (Ìáʾ£ºŒ¢ &> “Q³É >& Ò²ÐÐÀ²~~! ) okay£¿ÖvÍê·ð£¬½ÓÏÂ?í£¬ÔÙ׌ÎÒ‚ƒ¿´¿´ÈçÏÂÇé›r£º ´úÂë: $ echo "1" > file.out $ cat file.out 1 $ echo "2" > file.out $ cat file.out 2 ¿´?í£¬ÎÒ‚ƒÔÚÖØŒ§ stdout »ò stderr ßMÒ»·Ý™n°¸•r£¬ËƺõÓÀßhÖ»«@µÃ×îááÒ»´ÎŒ§ÈëµÄ½Y¹û¡£ ÄÇ£¬Ö®Ç°µÄƒÈÈÝÄØ£¿ ºÇ~~~ Òª½â›Qß@‚€†–ÌáºÜº††ÎÀ²£¬Œ¢ > “Q³É >> ¾ÍºÃ£º ´úÂë: $ echo "3" >> file.out $ cat file.out 2 3 Èç´ËÒ»?í£¬±»ÖØŒ§µÄÄ¿˜Ë™n°¸Ö®ƒÈÈÝ?K²»•þʧȥ£¬¶øÐµăÈÈÝ„tÒ»Ö±Ôö¼ÓÔÚ×îááÃæÈ¥¡£ easy £¿ ºÇ ... ^_^ µ«£¬Ö»ÒªÄãÔÙÒ»´ÎÓû؆ÎÒ»µÄ > ?íÖØŒ§µÄÔ’£¬ÄÇüN£¬ÅfµÄƒÈÈÝ߀ÊÇ•þ±»"Ï´"µôµÄ©u ß@•r£¬ÄãÒªÈçºÎ±ÜÃâÄØ£¿ ----‚ä·Ý©u yes £¬ÎÒ µ½ÁË©u²»ß^.... ߀ÓиüºÃµÄ†á£¿ ¼ÈÈ»ÅcÊ©Ö÷ß@üNÓо‰·Ý£¬Àϼ{¾ÍËÍÄãÒ»‚€åÄÒÃî·¨°É£º ´úÂë: $ set -o noclobber $ echo "4" > file.out -bash: file: cannot overwrite existing file ÄÇ£¬ÒªÈçºÎÈ¡Ïûß@‚€"ÏÞÖÆ"ÄØ£¿ Ŷ£¬Œ¢ set -o “Q³É set +o ¾ÍÐУº ´úÂë: $ set +o noclobber $ echo "5" > file.out $ cat file.out 5 ÔÙ†–£ºÄÇ... ÓÐÞk·¨²»È¡Ïû¶øÓÖ"ÅR•r"ÉwŒ‘Ä¿˜Ë™n°¸†á£¿ Ŷ£¬·ðÔ»£º²»¿É¸æÒ²©u °¡~~~ é_ÍæÐ¦µÄ¡¢é_ÍæÐ¦µÄÀ²~~~ ^_^ °¦£¬Ôç¾ÍÁϵ½ÈËÐÄÊDz»×ãµÄÁË©u ´úÂë: $ set -o noclobber $ echo "6" >| file.out $ cat file.out 6 ÁôÒâµ½›]ÓУºÔÚ > ááÃæÔÙ¼Ó‚€" | "¾ÍºÃ(×¢Ò⣺ > Åc | Ö®ég²»ÄÜÓпհ×Ŷ).... ºô.... (ÉîºôÎüͼ{һϰÉ)~~~ ^_^ ÔÙ?í߀ÓÐÒ»‚€ëyî}ÒªÄãÈ¥…¢Í¸µÄÄØ£º ´úÂë: $ echo "some text here" > file $ cat < file some text here $ cat < file > file.bak $ cat < file.bak some text here $ cat < file > file $ cat < file àÅ£¿©u×¢Òâµ½›]ÓУ¿©u©u ---- ÔõüN×îááÄÇ‚€ cat ÃüÁî¿´µ½µÄ file ¾¹Êǿյģ¿©u why? why? why? ͬŒW‚ƒ£ºÏ¹?Õn²»Òªßtµ½‡Ó~~~! -------------- 11.5 ‡Ž‡Ž‡Ž~~~ ÉÏÕn‡Ó~~~ ^_^ Ç°ÃæÌáµ½£º$ cat < file > file Ö®ááÔ±¾ÓЃÈÈݵęn°¸½Y¹û…s±»Ï´µôÁË©u ÒªÀí½âß@Ò»¬FÏñÆäŒ?²»ëy£¬ß@Ö»ÊÇ priority µÄ†–î}¶øÒÑ£º * ÔÚ IO Redirection ÖУ¬stdout Åc stderr µÄ¹ÜµÀ•þÏȜʂäºÃ£¬²Å•þ?Ä stdin ×xßMÙYÁÏ¡£ Ò²¾ÍÊÇÕf£¬ÔÚÉÏÀýÖУ¬> file •þÏÈŒ¢ file Çå¿Õ£¬È»áá²Å×xßM < file £¬ µ«ß@•rºò™n°¸Òѽ›±»Çå¿ÕÁË£¬Òò´Ë¾Í׃³É×x²»ßMÈκÎÙYÁÏÁË... Ŷ~~~ Ô?íÈç´Ë~~~~ ^_^ ÄÇ... ÈçσÉÀýÓÖÈçºÎÄØ£¿ ´úÂë: $ cat <> file $ cat < file >> file àÅ... ͬŒW‚ƒ£¬ß@ƒÉ‚€´ð°¸¾Í®”¾šÁ•î}‡Ó£¬Ï¹?Õn֮ǰՈ½»×÷˜I©u ºÃÁË£¬I/O Redirection Ò²¿ìÖvÍêÁË£¬sorry£¬ÒòžéÎÒÒ²Ö»ÖªµÀß@üN¶à¶øÒÑÀ²~~~ Îû~~ ^_^ ²»ß^£¬ß€ÓÐÒ»˜Ó–|–|ÊÇÒ»¶¨ÒªÖvµÄ£¬¸÷λÓ^±Š(Õˆ×ÔÐÐÅ䘷~!#@!$%) £º ---- ¾ÍÊÇ pipe line Ò²©u Õ„µ½ pipe line £¬ÎÒÏàÐŲ»ÉÙÈ˶¼²»•þİÉú£º ÎÒ‚ƒÔںܶà command line Éϳ£¿´µ½µÄ" | "·ûÌ–¾ÍÊÇ pipe line ÁË¡£ ²»ß^£¬¾¿¾¹ pipe line ÊÇÉõüN–|–|ÄØ£¿ „e¼±„e¼±... ÏȲéÒ»ÏÂÓ¢?h×ֵ䣬¿´¿´ pipe ÊÇÉõüNÒâ˼£¿ ›]åe©uËü¾ÍÊÇ"Ë®¹Ü"µÄÒâ˼... ÄÇüN£¬ÄãÄÜÏëÏñÒ»ÏÂË®¹ÜÊÇÔõüNÒ»¸ù½ÓÖøÒ»¸ùµÄ†á£¿ ÓÖ£¬Ã¿¸ùË®¹ÜÖ®égµÄ input ¸ú output ÓÖÈçºÎÄØ£¿ àÅ£¿£¿ ì`¹âÒ»éW£ºÔ?í pipe line µÄ I/O ¸úË®¹ÜµÄ I/O ÊÇһģһ˜ÓµÄ£º * ÉÏÒ»‚€ÃüÁîµÄ stdout ½Óµ½ÏÂÒ»‚€ÃüÁîµÄ stdin È¥ÁË©u µÄ´_Èç´Ë... ²»¹ÜÔÚ command line ÉÏÄãʹÓÃÁ˶àÉÙ‚€ pipe line £¬ ǰááƒÉ‚€ command µÄ I/O ¶¼ÊDZ˴ËßB½ÓµÄ©u(¹§Ï²£ºÄã½Kì¶é_¸[ÁË©u ^_^ ) ²»ß^... È»¶ø... µ«ÊÇ... ... stderr ÄØ£¿ ºÃ†–î}©u²»ß^Ò²ÈÝÒ×Àí½â£º * ÈôË®¹Ü©ˮÔõüNÞk£¿ Ò²¾ÍÊÇÕf£ºÔÚ pipe line Ö®ég£¬Ç°Ò»‚€ÃüÁîµÄ stderr ÊDz»•þ½ÓßMÏÂÒ»ÃüÁîµÄ stdin µÄ£¬ ÆäÝ”³ö£¬Èô²»Óà 2> Œ§µ½ file È¥µÄÔ’£¬Ëü߀ÊÇË͵½±OÒ•Æ÷ÉÏÃæ?í©u ß@ücÕˆÄãÔÚ pipe line ßÓÃÉτձØÒª×¢ÒâµÄ¡£ ÄÇ£¬»òÔSÄãÓÖ•þ†–£º * ÓÐÞk·¨Œ¢ stderr Ò²ðjßMÏÂÒ»‚€ÃüÁîµÄ stdin È¥†á£¿ (Ø?µÃŸo…’µÄ¼Òâ·©u) ·½·¨®”È»ÊÇÓУ¬¶øÇÒÄãÔçÒÑŒWß^ÁË©u ^_^ ÎÒÌáʾһϾͺ㺠* Õˆ†–ÄãÈçºÎŒ¢ stderr ºÏ?ãßM stdout һͬݔ³öÄØ£¿ ÈôÄã´ð²»³ö?í£¬ÏÂÕnÖ®ááÔÙ?톖ÎÒ°É... (Èç¹ûÄãÄ˜Æ¤Õæ‰òºñµÄÔ’...) »òÔS£¬ÄãÈÔÒâÓÈδ±M©u»òÔS£¬ÄãÔø½›Åöµ½ß^ÏÂÃæµÄ†–î}£º * ÔÚ cm1 | cm2 | cm3 ... ß@¶Î pipe line ÖУ¬ÈôÒªŒ¢ cm2 µÄ½Y¹û´æµ½Ä³Ò»™n°¸ÄØ£¿ ÈôÄ㌑³É cm1 | cm2 > file | cm3 µÄÔ’£¬ ÄÇÄã¿Ï¶¨•þ°l¬F cm3 µÄ stdin Êǿյĩu(®”È»À²£¬Äã¶¼Œ¢Ë®¹Ü½Óµ½„eµÄË®³ØÁË©u) ”Ã÷µÄÄã»òÔS•þÈç´Ë½â›Q£º ´úÂë: cm1 | cm2 > file ; cm3 < file Êǵģ¬ÄãµÄ´_¿ÉÒÔß@˜Ó×ö£¬µ«×î´óµÄ‰ÄÌŽÊÇ£ºß@˜ÓÒ»?í£¬file I/O •þ׃ëp±¶©u ÔÚ command ˆÌÐеÄÕû‚€ß^³ÌÖУ¬file I/O ÊÇ×î³£ÒŠµÄ×î´óЧÄÜš¢ÊÖ¡£ ·²ÊÇÓн›òžµÄ shell ²Ù×÷Õߣ¬¶¼•þ±MÁ¿±ÜÃâ»ò½µµÍ file I/O µÄîlÂÊ¡£ ÄÇ£¬ÉÏÃæ†–î}߀ÓиüºÃ·½·¨†á£¿ Óеģ¬ÄǾÍÊÇ tee ÃüÁîÁË¡£ * ËùÖ^ tee ÃüÁîÊÇÔÚ²»Ó°í‘Ô±¾ I/O µÄÇé›rÏ£¬Œ¢ stdout Ñ}ÑuÒ»·Ýµ½™n°¸È¥¡£ Òò´Ë£¬ÉÏÃæµÄÃüÁîÐпÉÒÔÈç´Ë´ò£º ´úÂë: cm1 | cm2 | tee file | cm3 ÔÚîAÔOÉÏ£¬tee •þ¸ÄŒ‘Ä¿˜Ë™n°¸£¬ÈôÄãÒª¸ÄžéÔö¼ÓƒÈÈݵÄÔ’£¬ÄÇ¿ÉÓà -a …¢”µß_³É¡£ »ù±¾ÉÏ£¬pipe line µÄ‘ªÓÃÔÚ shell ²Ù×÷ÉÏÊǷdz£?V·ºµÄ£¬ÓÈÆäÊÇÔÚ text filtering ·½Ã棬 ·²Åe cat, more, head, tail, wc, expand, tr, grep, sed, awk, ... µÈµÈÎÄ×ÖÌŽÀí¹¤¾ß£¬ ´îÅäÆð pipe line ?íʹÓã¬Äã•þó@ÓX command line Ô?íÊÇ»îµÃÈç´Ë¾«²ÊµÄ©u ³£×ŒÈËÓÐ"±ŠÑeŒ¤Ëûǧ°Ù¶È£¬ò‡È»»ØÊ×£¬ÄÇÈË…sÔÚŸô»ðê@ɺ̎©u"Ö®¸Ð... ^_^ .... ºÃÁË£¬êPì¶ I/O Redirection µÄ½é½B¾Íµ½´Ë¸æÒ»¶ÎÂä¡£ ÈôÈÕááÓпյÄÔ’£¬ÔÙžé´ó¼Ò½é½BÆäËüÔÚ shell ÉϺÃÍæµÄ–|Î÷©ubye... ^_^ 13) for what? while Åc until ²îÔÚÄÄ£¿ ½Kì¶£¬?íµ½ shell Ê®Èý†–µÄ×îááÒ»†–ÁË... éLéLÍÂÒ»¿Úšâ~~~~ ×îááÒª½é½BµÄÊÇ shell script ÔOÓ‹Öг£ÒеÄ"Ñh"(loop)¡£ ËùÖ^µÄ loop ¾ÍÊÇ script ÖеÄÒ»¶ÎÔÚÒ»¶¨—l¼þÏ·´¸²ˆÌÐеĴú´a¡£ bash shell Öг£ÓÃµÄ loop ÓÐÈçÏÂÈý·N£º * for * while * until for loop ÊÇ?ÄÒ»‚€Çå†ÎÁбíÖÐ×xßM׃Á¿Öµ£¬?K"ÒÀ´Î"µÄÑhˆÌÐÐ do µ½ done Ö®égµÄÃüÁîÐС£ Àý£º ´úÂë: for var in one two three four five do echo ----------- echo '$var is '$var echo done ÉÏÀýµÄˆÌÐнY¹ûŒ¢•þÊÇ£º 1) for •þ¶¨ÁxÒ»‚€½Ð var µÄ׃Á¿£¬ÆäÖµÒÀ´ÎÊÇ one two three four five ¡£ 2) ÒòžéÓÐ 5 ‚€×ƒÁ¿Öµ£¬Òò´Ë do Åc done Ö®égµÄÃüÁîÐЕþ±»ÑhˆÌÐÐ 5 ´Î¡£ 3) ÿ´ÎÑh¾ùÓà echo ®aÉúÈýÐоä×Ó¡£ ¶øµÚ¶þÐÐÖв»ÔÚ hard quote Ö®ƒÈµÄ $var •þÒÀ´Î±»Ìæ“Qžé one two three four five ¡£ 4) ®”×îááÒ»‚€×ƒÁ¿ÖµÌŽÀíÍê®…£¬Ñh½YÊø¡£ ÎÒ‚ƒ²»ëy¿´³ö£¬ÔÚ for loop ÖУ¬×ƒÁ¿ÖµµÄ¶à¹Ñ£¬›Q¶¨ÑhµÄ´Î”µ¡£ È»¶ø£¬×ƒÁ¿ÔÚÑhÖÐÊÇ·ñʹÓÄt²»Ò»¶¨£¬µÃÒ•ÔOÓ‹ÐèÇó¶ø¶¨¡£ ÌÈÈô for loop ›]ÓÐʹÓà in ß@‚€ keyword ?íÖ¸¶¨×ƒÁ¿ÖµÇå†ÎµÄÔ’£¬ÆäÖµŒ¢?Ä $@ (»ò $* )ÖÐÀ^³Ð£º ´úÂë: for var; do .... done (ÈôÄãÍüÓ›ÁË positional parameter £¬ÕˆœØÁ•µÚ 9 ÕÂ...) for loop ÓÃì¶ÌŽÀí"Çå†Î"(list)í—Ä¿·Ç³£·½±ã£¬ ÆäÇå†Î³ýÁË¿ÉÃ÷´_Ö¸¶¨»ò?Ä positional parameter È¡µÃÖ®Í⣬ Ò²¿É?Ä׃Á¿Ìæ“Q»òÃüÁîÌæ“QÈ¡µÃ... (ÔÙÒ»´ÎÌáÐÑ£º„eÍüÁËÃüÁîÐеÄ"ÖØ½M"ÌØÐÔ©u) È»¶ø£¬Œ¦ì¶Ò»Ð©"ÀÛӋ׃»¯"µÄí—Ä¿(ÈçÕû”µ¼Óœp)£¬for ÒàÄÜÌŽÀí£º ´úÂë: for ((i=1;i<=10;i++)) do echo "num is $i" done ³ýÁË for loop £¬ÉÏÃæµÄÀý×ÓÎÒ‚ƒÒ²¿É¸ÄÓà while loop ?í×öµ½£º ´úÂë: num=1 while [ "$num" -le 10 ]; do echo "num is $num" num=$(($num + 1)) done while loop µÄÔÀíÅc for loop ÉÔÓв»Í¬£º Ëü²»ÊÇÖð´ÎÌŽÀíÇå†ÎÖеÄ׃Á¿Öµ£¬¶øÊÇÈ¡›Qì¶ while ááÃæµÄÃüÁîÐÐÖ® return value £º * Èôžé ture £¬„tˆÌÐÐ do Åc done Ö®égµÄÃüÁȻááÖØÐÂÅДà while ááµÄ return value ¡£ * Èôžé false £¬„t²»ÔÙˆÌÐÐ do Åc done Ö®égµÄÃüÁî¶ø½YÊøÑh¡£ ·ÖÎöÉÏÀý£º 1) ÔÚ while ֮ǰ£¬¶¨Áx׃Á¿ num=1 ¡£ 2) È»ááœyÔ‡(test) $num ÊÇ·ñС춻òµÈì¶ 10 ¡£ 3) ½Y¹ûžé true £¬ì¶ÊLjÌÐÐ echo ?KŒ¢ num µÄÖµ¼ÓÒ»¡£ 4) ÔÙ×÷µÚ¶þ݆œyÔ‡£¬Æä•r num µÄÖµžé 1+1=2 £¬ÒÀȻС춻òµÈì¶ 10£¬Òò´Ëžé true £¬À^ÀmÑh¡£ 5) Ö±µ½ num žé 10+1=11 •r£¬œyÔ‡²Å•þʧ”¡... ì¶ÊǽYÊøÑh¡£ ÎÒ‚ƒ²»ëy°l¬F£º * Èô while µÄœyÔ‡½Y¹ûÓÀßhžé true µÄÔ’£¬ÄÇÑhŒ¢Ò»Ö±ÓÀ¾ÃˆÌÐÐÏÂÈ¥£º ´úÂë: while :; do echo looping... done ÉÏÀýµÄ" : "ÊÇ bash µÄ null command £¬²»×öÈκ΄Ó×÷£¬³ýÁËËÍ»Ø true µÄ return value ¡£ Òò´Ëß@‚€Ñh²»•þ½YÊø£¬·Q×÷ËÀÑh¡£ ËÀÑhµÄ®aÉúÓпÉÄÜÊǹÊÒâÔOÓ‹µÄ(ÈçÅÜ daemon)£¬Ò²¿ÉÄÜÊÇÔOÓ‹åeÕ`¡£ ÈôÒª½YÊøËÀŒ¤h£¬¿É͸ß^ signal ?í½KÖ¹(Èç°´Ï ctrl-c )¡£ (êPì¶ process Åc signal £¬µÈÈÕááÓЙC•þÔÙÑa³ä£¬Ê®Èý†–•º•rÂÔß^¡£) Ò»µ©ÄãÄ܉òÀí½â while loop µÄÔ’£¬ÄÇ£¬¾ÍÄÜÀí½â until loop £º * Åc while Ïà·´£¬until ÊÇÔÚ return value žé false •rßMÈëÑh£¬·ñ„t½YÊø¡£ Òò´Ë£¬Ç°ÃæµÄÀý×ÓÎÒ‚ƒÒ²¿ÉÒÔÝpó µÄÓà until ?팑£º ´úÂë: num=1 until [ ! "$num" -le 10 ]; do echo "num is $num" num=$(($num + 1)) done »òÊÇ£º ´úÂë: num=1 until [ "$num" -gt 10 ]; do echo "num is $num" num=$(($num + 1)) done okay £¬êPì¶ bash µÄÈý‚€³£ÓÃµÄ loop •º•r½é½Bµ½ß@Ñe¡£ ÔÚ½YÊø±¾ÕÂ֮ǰ£¬ÔÙ¸ú´ó¼ÒÑa³äƒÉ‚€Åc loop ÓÐêPµÄÃüÁ * break * continue ß@ƒÉ‚€ÃüÁî³£ÓÃÔÚÑ}ºÏʽÑhÑe£¬Ò²¾ÍÊÇÔÚ do ... done Ö®égÓÖÓиüßMÒ»ŒÓµÄ loop £¬ ®”È»£¬ÓÃÔÚ†ÎÒ»ÑhÖÐҲδ‡L²»¿ÉÀ²... ^_^ break ÊÇÓÃ?í´ò”àÑh£¬Ò²¾ÍÊÇ"?ŠÆÈ½YÊø" Ñh¡£ Èô break ááÃæÖ¸¶¨Ò»‚€”µÖµ n µÄÔ’£¬„t"?ÄÑeÏòÍâ"´ò”àµÚ n ‚€Ñh£¬ îAÔOÖµžé break 1 £¬Ò²¾ÍÊÇ´ò”ஔǰµÄÑh¡£ ÔÚʹÓà break •rÐèҪעÒâµÄÊÇ£¬ ËüÅc return ¼° exit ÊDz»Í¬µÄ£º * break ÊǽYÊø loop * return ÊǽYÊø function * exit ÊǽYÊø script/shell ¶ø continue „tÅc break Ïà·´£º?ŠÆÈßMÈëÏÂÒ»´ÎÑh„Ó×÷¡£ ÈôÄãÀí½â²»?íµÄÔ’£¬ÄÇÄã¿Éº††ÎµÄ¿´³É£ºÔÚ continue µ½ done Ö®égµÄ¾ä×ÓÂÔß^¶ø·µ»ØÑhí”¶Ë... Åc break ÏàͬµÄÊÇ£ºcontinue ááÃæÒ²¿ÉÖ¸¶¨Ò»‚€”µÖµ n £¬ÒÔ›Q¶¨À^ÀmÄÄÒ»ŒÓ(?ÄÑeÏòÍâÓ‹Ëã)µÄÑh£¬ îAÔOÖµžé continue 1 £¬Ò²¾ÍÊÇÀ^Àm®”ǰµÄÑh¡£ ÔÚ shell script ÔOÓ‹ÖУ¬ÈôÄÜÉÆÓà loop £¬Œ¢ÄÜ´ó·ù¶ÈÌá¸ß script ÔÚÑ}ës—l¼þϵÄÌŽÀíÄÜÁ¦¡£ Õˆ¶à¼Ó¾šÁ•°É.... ----------- ºÃÁË£¬Ô“Êǵ½Á˽YÊøµÄ•rºòÁË¡£ ÆÅÆÅ‹Œ‹ŒµÄ¸ú´ó¼Ò‡ÓËôÁËÒ»¶ÑêPì¶ shell µÄ»ùµA¸ÅÄ Ä¿µÄ²»ÊÇÒª¸æÔV´ó¼Ò"´ð°¸"£¬¶øÊÇÒªŽ§½o´ó¼Ò"†¢°l"... ÔÚÈÕááêPì¶ shell µÄÓ‘Õ“ÖУ¬ÎÒ»òÔS•þ½›³£ÓÃ"朽Ó"·½Ê½Ö¸Òý»Ø?íÊ®Èý†–ÖеăÈÈÝ£¬ ÒÔ±ãÎÒ‚ƒÔÚßMÐм¼Ðg̽ӑ•r±Ë´ËÄÜÓÐһЩӑՓ»ùµA£¬¶ø²»ÖÁ춸÷Õf¸÷Ô’¡¢Í½ÙM•rÁ¦¡£ µ«£¬¸üÏ£ÍûÊ®Èý†–ÄÜŽ§½oÄã¸ü¶àµÄ˼¿¼Åc˜·È¤£¬ÖÁžéÖØÒªµÄÊÇ͸ß^Œ?×÷?í¼ÓÉîÀí½â¡£ Êǵģ¬ÎÒºÜÖØÒ•"Œ?×÷"Åc"ªšÁ¢Ë¼¿¼"ß@ƒÉí—ŒWÁ•ÒªËØ£¬ÈôÄãÄ܉òÕÆÎÕÆäÖÐÕæÁx£¬ÄÇÕˆÈÝÎÒÕf•£º --- ¹§Ï²©uÊ®Èý†–Äã›]°×¿´ÁË©u ^_^ p.s. ÖÁì¶Ña³ä†–î}²¿·Ý£¬ÎÒ•º•r²»Œ‘ÁË¡£¶øÊÇÏ£Íû£º 1) ´ó¼Ò”U³äî}Ä¿¡£ 2) Ò»Æð?팑ÐĵᣠGood luck and happy studying! 13) for what? while Åc until ²îÔÚÄÄ£¿ ½Kì¶£¬?íµ½ shell Ê®Èý†–µÄ×îááÒ»†–ÁË... éLéLÍÂÒ»¿Úšâ~~~~ ×îááÒª½é½BµÄÊÇ shell script ÔOÓ‹Öг£ÒеÄ"Ñh"(loop)¡£ ËùÖ^µÄ loop ¾ÍÊÇ script ÖеÄÒ»¶ÎÔÚÒ»¶¨—l¼þÏ·´¸²ˆÌÐеĴú´a¡£ bash shell Öг£ÓÃµÄ loop ÓÐÈçÏÂÈý·N£º * for * while * until for loop ÊÇ?ÄÒ»‚€Çå†ÎÁбíÖÐ×xßM׃Á¿Öµ£¬?K"ÒÀ´Î"µÄÑhˆÌÐÐ do µ½ done Ö®égµÄÃüÁîÐС£ Àý£º ´úÂë: for var in one two three four five do echo ----------- echo '$var is '$var echo done ÉÏÀýµÄˆÌÐнY¹ûŒ¢•þÊÇ£º 1) for •þ¶¨ÁxÒ»‚€½Ð var µÄ׃Á¿£¬ÆäÖµÒÀ´ÎÊÇ one two three four five ¡£ 2) ÒòžéÓÐ 5 ‚€×ƒÁ¿Öµ£¬Òò´Ë do Åc done Ö®égµÄÃüÁîÐЕþ±»ÑhˆÌÐÐ 5 ´Î¡£ 3) ÿ´ÎÑh¾ùÓà echo ®aÉúÈýÐоä×Ó¡£ ¶øµÚ¶þÐÐÖв»ÔÚ hard quote Ö®ƒÈµÄ $var •þÒÀ´Î±»Ìæ“Qžé one two three four five ¡£ 4) ®”×îááÒ»‚€×ƒÁ¿ÖµÌŽÀíÍê®…£¬Ñh½YÊø¡£ ÎÒ‚ƒ²»ëy¿´³ö£¬ÔÚ for loop ÖУ¬×ƒÁ¿ÖµµÄ¶à¹Ñ£¬›Q¶¨ÑhµÄ´Î”µ¡£ È»¶ø£¬×ƒÁ¿ÔÚÑhÖÐÊÇ·ñʹÓÄt²»Ò»¶¨£¬µÃÒ•ÔOÓ‹ÐèÇó¶ø¶¨¡£ ÌÈÈô for loop ›]ÓÐʹÓà in ß@‚€ keyword ?íÖ¸¶¨×ƒÁ¿ÖµÇå†ÎµÄÔ’£¬ÆäÖµŒ¢?Ä $@ (»ò $* )ÖÐÀ^³Ð£º ´úÂë: for var; do .... done (ÈôÄãÍüÓ›ÁË positional parameter £¬ÕˆœØÁ•µÚ 9 ÕÂ...) for loop ÓÃì¶ÌŽÀí"Çå†Î"(list)í—Ä¿·Ç³£·½±ã£¬ ÆäÇå†Î³ýÁË¿ÉÃ÷´_Ö¸¶¨»ò?Ä positional parameter È¡µÃÖ®Í⣬ Ò²¿É?Ä׃Á¿Ìæ“Q»òÃüÁîÌæ“QÈ¡µÃ... (ÔÙÒ»´ÎÌáÐÑ£º„eÍüÁËÃüÁîÐеÄ"ÖØ½M"ÌØÐÔ©u) È»¶ø£¬Œ¦ì¶Ò»Ð©"ÀÛӋ׃»¯"µÄí—Ä¿(ÈçÕû”µ¼Óœp)£¬for ÒàÄÜÌŽÀí£º ´úÂë: for ((i=1;i<=10;i++)) do echo "num is $i" done ³ýÁË for loop £¬ÉÏÃæµÄÀý×ÓÎÒ‚ƒÒ²¿É¸ÄÓà while loop ?í×öµ½£º ´úÂë: num=1 while [ "$num" -le 10 ]; do echo "num is $num" num=$(($num + 1)) done while loop µÄÔÀíÅc for loop ÉÔÓв»Í¬£º Ëü²»ÊÇÖð´ÎÌŽÀíÇå†ÎÖеÄ׃Á¿Öµ£¬¶øÊÇÈ¡›Qì¶ while ááÃæµÄÃüÁîÐÐÖ® return value £º * Èôžé ture £¬„tˆÌÐÐ do Åc done Ö®égµÄÃüÁȻááÖØÐÂÅДà while ááµÄ return value ¡£ * Èôžé false £¬„t²»ÔÙˆÌÐÐ do Åc done Ö®égµÄÃüÁî¶ø½YÊøÑh¡£ ·ÖÎöÉÏÀý£º 1) ÔÚ while ֮ǰ£¬¶¨Áx׃Á¿ num=1 ¡£ 2) È»ááœyÔ‡(test) $num ÊÇ·ñС춻òµÈì¶ 10 ¡£ 3) ½Y¹ûžé true £¬ì¶ÊLjÌÐÐ echo ?KŒ¢ num µÄÖµ¼ÓÒ»¡£ 4) ÔÙ×÷µÚ¶þ݆œyÔ‡£¬Æä•r num µÄÖµžé 1+1=2 £¬ÒÀȻС춻òµÈì¶ 10£¬Òò´Ëžé true £¬À^ÀmÑh¡£ 5) Ö±µ½ num žé 10+1=11 •r£¬œyÔ‡²Å•þʧ”¡... ì¶ÊǽYÊøÑh¡£ ÎÒ‚ƒ²»ëy°l¬F£º * Èô while µÄœyÔ‡½Y¹ûÓÀßhžé true µÄÔ’£¬ÄÇÑhŒ¢Ò»Ö±ÓÀ¾ÃˆÌÐÐÏÂÈ¥£º ´úÂë: while :; do echo looping... done ÉÏÀýµÄ" : "ÊÇ bash µÄ null command £¬²»×öÈκ΄Ó×÷£¬³ýÁËËÍ»Ø true µÄ return value ¡£ Òò´Ëß@‚€Ñh²»•þ½YÊø£¬·Q×÷ËÀÑh¡£ ËÀÑhµÄ®aÉúÓпÉÄÜÊǹÊÒâÔOÓ‹µÄ(ÈçÅÜ daemon)£¬Ò²¿ÉÄÜÊÇÔOÓ‹åeÕ`¡£ ÈôÒª½YÊøËÀŒ¤h£¬¿É͸ß^ signal ?í½KÖ¹(Èç°´Ï ctrl-c )¡£ (êPì¶ process Åc signal £¬µÈÈÕááÓЙC•þÔÙÑa³ä£¬Ê®Èý†–•º•rÂÔß^¡£) Ò»µ©ÄãÄ܉òÀí½â while loop µÄÔ’£¬ÄÇ£¬¾ÍÄÜÀí½â until loop £º * Åc while Ïà·´£¬until ÊÇÔÚ return value žé false •rßMÈëÑh£¬·ñ„t½YÊø¡£ Òò´Ë£¬Ç°ÃæµÄÀý×ÓÎÒ‚ƒÒ²¿ÉÒÔÝpó µÄÓà until ?팑£º ´úÂë: num=1 until [ ! "$num" -le 10 ]; do echo "num is $num" num=$(($num + 1)) done »òÊÇ£º ´úÂë: num=1 until [ "$num" -gt 10 ]; do echo "num is $num" num=$(($num + 1)) done okay £¬êPì¶ bash µÄÈý‚€³£ÓÃµÄ loop •º•r½é½Bµ½ß@Ñe¡£ ÔÚ½YÊø±¾ÕÂ֮ǰ£¬ÔÙ¸ú´ó¼ÒÑa³äƒÉ‚€Åc loop ÓÐêPµÄÃüÁ * break * continue ß@ƒÉ‚€ÃüÁî³£ÓÃÔÚÑ}ºÏʽÑhÑe£¬Ò²¾ÍÊÇÔÚ do ... done Ö®égÓÖÓиüßMÒ»ŒÓµÄ loop £¬ ®”È»£¬ÓÃÔÚ†ÎÒ»ÑhÖÐҲδ‡L²»¿ÉÀ²... ^_^ break ÊÇÓÃ?í´ò”àÑh£¬Ò²¾ÍÊÇ"?ŠÆÈ½YÊø" Ñh¡£ Èô break ááÃæÖ¸¶¨Ò»‚€”µÖµ n µÄÔ’£¬„t"?ÄÑeÏòÍâ"´ò”àµÚ n ‚€Ñh£¬ îAÔOÖµžé break 1 £¬Ò²¾ÍÊÇ´ò”ஔǰµÄÑh¡£ ÔÚʹÓà break •rÐèҪעÒâµÄÊÇ£¬ ËüÅc return ¼° exit ÊDz»Í¬µÄ£º * break ÊǽYÊø loop * return ÊǽYÊø function * exit ÊǽYÊø script/shell ¶ø continue „tÅc break Ïà·´£º?ŠÆÈßMÈëÏÂÒ»´ÎÑh„Ó×÷¡£ ÈôÄãÀí½â²»?íµÄÔ’£¬ÄÇÄã¿Éº††ÎµÄ¿´³É£ºÔÚ continue µ½ done Ö®égµÄ¾ä×ÓÂÔß^¶ø·µ»ØÑhí”¶Ë... Åc break ÏàͬµÄÊÇ£ºcontinue ááÃæÒ²¿ÉÖ¸¶¨Ò»‚€”µÖµ n £¬ÒÔ›Q¶¨À^ÀmÄÄÒ»ŒÓ(?ÄÑeÏòÍâÓ‹Ëã)µÄÑh£¬ îAÔOÖµžé continue 1 £¬Ò²¾ÍÊÇÀ^Àm®”ǰµÄÑh¡£ ÔÚ shell script ÔOÓ‹ÖУ¬ÈôÄÜÉÆÓà loop £¬Œ¢ÄÜ´ó·ù¶ÈÌá¸ß script ÔÚÑ}ës—l¼þϵÄÌŽÀíÄÜÁ¦¡£ Õˆ¶à¼Ó¾šÁ•°É.... ----------- ºÃÁË£¬Ô“Êǵ½Á˽YÊøµÄ•rºòÁË¡£ ÆÅÆÅ‹Œ‹ŒµÄ¸ú´ó¼Ò‡ÓËôÁËÒ»¶ÑêPì¶ shell µÄ»ùµA¸ÅÄ Ä¿µÄ²»ÊÇÒª¸æÔV´ó¼Ò"´ð°¸"£¬¶øÊÇÒªŽ§½o´ó¼Ò"†¢°l"... ÔÚÈÕááêPì¶ shell µÄÓ‘Õ“ÖУ¬ÎÒ»òÔS•þ½›³£ÓÃ"朽Ó"·½Ê½Ö¸Òý»Ø?íÊ®Èý†–ÖеăÈÈÝ£¬ ÒÔ±ãÎÒ‚ƒÔÚßMÐм¼Ðg̽ӑ•r±Ë´ËÄÜÓÐһЩӑՓ»ùµA£¬¶ø²»ÖÁ춸÷Õf¸÷Ô’¡¢Í½ÙM•rÁ¦¡£ µ«£¬¸üÏ£ÍûÊ®Èý†–ÄÜŽ§½oÄã¸ü¶àµÄ˼¿¼Åc˜·È¤£¬ÖÁžéÖØÒªµÄÊÇ͸ß^Œ?×÷?í¼ÓÉîÀí½â¡£ Êǵģ¬ÎÒºÜÖØÒ•"Œ?×÷"Åc"ªšÁ¢Ë¼¿¼"ß@ƒÉí—ŒWÁ•ÒªËØ£¬ÈôÄãÄ܉òÕÆÎÕÆäÖÐÕæÁx£¬ÄÇÕˆÈÝÎÒÕf•£º --- ¹§Ï²©uÊ®Èý†–Äã›]°×¿´ÁË©u ^_^ p.s. ÖÁì¶Ña³ä†–î}²¿·Ý£¬ÎÒ•º•r²»Œ‘ÁË¡£¶øÊÇÏ£Íû£º 1) ´ó¼Ò”U³äî}Ä¿¡£ 2) Ò»Æð?팑ÐĵᣠGood luck and happy studying! <hr></pre></blockquote><p></p> <p></p><p><font size="2"><hr align="left" color="#689cd0" size="1" width="300"> ×ªÔØ×Ô£ºhttp://www.unlinux.com/doc/shell/20051026/220.html ¡¾ÆÀÂÛ¡¿ ¡¾¼ÓÈëÊղؼС¿ ¡¾´ó ÖРС¡¿ ¡¾´òÓ¡¡¿ ¡¾¹Ø±Õ¡¿ ¡ù Ïà¹ØÁ´½Ó
|