ÄúµÄλÖãºÊ×Ò³ > Îĵµ > 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 "1411114211143121441114511146"
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‚÷ÐÔ"¾ÍÊÇ…^·Ö±¾µØ×ƒÁ¿Åc­h¾³×ƒÁ¿µÄ›Q¶¨ÐÔÖ¸˜Ë¡£
È»¶ø£¬?Äßz‚÷µÄ½Ç¶È?í¿´£¬ÎÒ‚ƒÒ²²»ëy°l¬F­h¾³×ƒÁ¿µÄÁíÒ»‚€ÖØÒªÌØá磺
* ­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

¡¾ÆÀÂÛ¡¿ ¡¾¼ÓÈëÊղؼС¿ ¡¾´ó ÖРС¡¿ ¡¾´òÓ¡¡¿ ¡¾¹Ø±Õ¡¿
 *  Çë×ðÖØÎÒÃǵÄÀͶ¯£¬×ªÔØÇë×¢Ã÷³ö×ÔUnLinux.Com¼°×÷ÕßÃû * 

¡ù Ïà¹ØÁ´½Ó
 ¡¤shellÓ÷¨  (2005-10-26 00:49:45)
 ¡¤shellÖÐÑ­»·È¡³öÎļþÖÐÿһÐи³ÓèÒ»±äÁ¿µÄÎÊÌâ  (2005-10-26 00:49:45)
 ¡¤shellÖеÄÐкÍÁР (2005-10-26 00:49:45)
 ¡¤shell°æ¶íÂÞ˹·½¿é  (2005-10-26 00:49:45)
 ¡¤Shell±à³Ì  (2005-10-26 00:49:45)
 ¡¤shell²ÎÊýÎÊÌ⣬linux  (2005-10-26 00:49:45)
 ¡¤ShellµÝ¹é³ÌÐòÉè¼Æ/ÅúÁ¿×ª»»´óдÎļþÃûΪСд  (2005-10-26 00:49:45)
 ¡¤shellµÄÎÊÌâ  (2005-10-26 00:49:45)
 ¡¤ShellµÄ÷ÈÁ¦  (2005-10-26 00:49:45)
 ¡¤Shell¸ß¼¶ÆÁÄ»Êä³ö  (2005-10-26 00:49:45)

Copyright © 2005 UnLinux.Com All Rights Reserved