{"id":584,"date":"2014-07-15T01:48:20","date_gmt":"2014-07-15T01:48:20","guid":{"rendered":"http:\/\/ixyzero.com\/blog\/?p=584"},"modified":"2014-07-15T01:48:20","modified_gmt":"2014-07-15T01:48:20","slug":"shell%e5%8d%81%e4%b8%89%e9%97%ae-chinaunix%e8%ae%ba%e5%9d%9b%e7%b2%be%e5%8d%8e%e6%95%b4%e7%90%86","status":"publish","type":"post","link":"https:\/\/ixyzero.com\/blog\/archives\/584.html","title":{"rendered":"Shell\u5341\u4e09\u95ee\u2014\u2014ChinaUnix\u8bba\u575b\u7cbe\u534e\u6574\u7406"},"content":{"rendered":"<p><strong>Shell<\/strong><strong>\u5341\u4e09\u95ee<\/strong><strong>\u2014\u2014ChinaUnix<\/strong><strong>\u8bba\u575b\u7cbe\u534e\u6574\u7406<\/strong><\/p>\n<p><strong>\u76ee<\/strong><strong>\u5f55\u6982\u89c8<\/strong><\/p>\n<ol>\n<ol>\n<li><span style=\"line-height: 1.5;\">\u4e3a\u4f55\u53eb\u505a shell \uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">shell prompt(PS1) \u4e0e Carriage Return(CR) \u7684\u5173\u7cfb\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">\u522b\u4eba echo\u3001\u4f60\u4e5f echo \uff0c\u662f\u95ee echo \u77e5\u591a\u5c11\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">&#8221; &#8220;(\u53cc\u5f15\u53f7) \u4e0e &#8216; &#8216;(\u5355\u5f15\u53f7)\u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">var=value\uff1fexport \u524d\u540e\u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">exec \u8ddf source \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">( ) \u4e0e { } \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">$(( )) \u4e0e $( ) \u8fd8\u6709${ } \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">$@ \u4e0e $* \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">&amp;&amp; \u4e0e || \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">&gt; \u4e0e &lt; \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">\u4f60\u8981 if \u8fd8\u662f case \u5462\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">for what?\u00a0\u00a0while \u4e0e until \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<li><span style=\"line-height: 1.5;\">[^ ] \u8ddf [! ] \u5dee\u5728\u54ea\uff1f<\/span><\/li>\n<\/ol>\n<\/ol>\n<h1>1 \u4e3a\u4f55\u53eb\u505a shell \uff1f<\/h1>\n<p>\u5728\u4ecb\u7ecd shell \u662f\u4ec0\u4e48\u4e1c\u897f\u4e4b\u524d\uff0c\u4e0d\u59a8\u8ba9\u6211\u4eec\u91cd\u65b0\u68c0\u89c6\u4f7f\u7528\u8005\u4e0e\u8ba1\u7b97\u673a\u7684\u5173\u7cfb\uff1a\u6211\u4eec\u77e5\u9053\u8ba1\u7b97\u673a\u7684\u8fd0\u4f5c\u4e0d\u80fd\u79bb\u5f00\u786c\u4ef6\uff0c\u4f46\u4f7f\u7528\u8005\u5374\u65e0\u6cd5\u76f4\u63a5\u5bf9\u786c\u4ef6\u4f5c\u9a71\u52a8\uff0c\u786c\u4ef6\u7684\u9a71\u52a8\u53ea\u80fd\u900f\u8fc7\u201c\u64cd\u4f5c\u7cfb\u7edf(Operating System)\u201d\u7684\u8f6f\u4ef6\u6765\u63a7\u7ba1\uff0c\u4e8b\u5b9e\u4e0a\uff0c\u6211\u4eec\u6bcf\u5929\u6240\u8c08\u7684 Linux \uff0c\u4e25\u683c\u6765\u8bf4\u53ea\u662f\u4e00\u4e2a\u64cd\u4f5c\u7cfb\u7edf\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u201c\u5185\u6838(kernel)\u201d\u3002\u7136\u800c\uff0c\u4ece\u4f7f\u7528\u8005\u7684\u89d2\u5ea6\u6765\u8bf4\uff0c\u4f7f\u7528\u8005\u4e5f\u6ca1\u529e\u6cd5\u76f4\u63a5\u64cd\u4f5c kernel \uff0c\u800c\u662f\u900f\u8fc7 kernel \u7684\u201c\u5916\u58f3\u201d\u7a0b\u5e8f\uff0c\u4e5f\u5c31\u662f\u6240\u8c13\u7684 shell \uff0c\u6765\u4e0e kernel \u6c9f\u901a\u3002\u8fd9\u4e5f\u6b63\u662f kernel \u8ddf shell \u7684\u5f62\u8c61\u547d\u540d\u5173\u7cfb\u3002<\/p>\n<p>\u4ece\u6280\u672f\u89d2\u5ea6\u6765\u8bf4\uff0cshell \u662f\u4e00\u4e2a\u4f7f\u7528\u8005\u4e0e\u7cfb\u7edf\u7684\u4e92\u52a8\u754c\u9762(interface)\uff0c\u4e3b\u8981\u662f\u8ba9\u4f7f\u7528\u8005\u900f\u8fc7\u547d\u4ee4\u884c(command line)\u6765\u4f7f\u7528\u7cfb\u7edf\u4ee5\u5b8c\u6210\u5de5\u4f5c\u3002<\/p>\n<p>\u56e0\u6b64\uff0cshell \u7684\u6700\u7b80\u5355\u7684\u5b9a\u4e49\u5c31\u662f&#8212;-\u547d\u4ee4\u89e3\u8bd1\u5668(Command Interpreter)\uff1a<\/p>\n<p>* \u5c06\u4f7f\u7528\u8005\u7684\u547d\u4ee4\u7ffb\u8bd1\u7ed9\u6838\u5fc3\u5904\u7406<\/p>\n<p>* \u540c\u65f6\uff0c\u5c06\u6838\u5fc3\u5904\u7406\u7ed3\u679c\u7ffb\u8bd1\u7ed9\u4f7f\u7528\u8005\u3002<\/p>\n<p>\u6bcf\u6b21\u5f53\u6211\u4eec\u5b8c\u6210\u7cfb\u7edf\u767b\u5165(log in)\uff0c\u6211\u4eec\u5c31\u53d6\u5f97\u4e00\u4e2a\u4e92\u52a8\u6a21\u5f0f\u7684 shell \uff0c\u4e5f\u79f0\u4e3a login shell \u6216 primary shell\u3002\u82e5\u4ece\u8fdb\u7a0b(process)\u89d2\u5ea6\u6765\u8bf4\uff0c\u6211\u4eec\u5728 shell \u6240\u4e0b\u8fbe\u7684\u547d\u4ee4\uff0c\u5747\u662f shell \u6240\u4ea7\u751f\u7684\u5b50\u8fdb\u7a0b\u3002\u8fd9\u73b0\u50cf\uff0c\u6211\u4eec\u6682\u53ef\u79f0\u4e4b\u4e3a fork \u3002\u5982\u679c\u662f\u6267\u884c\u811a\u672c(shell script)\u7684\u8bdd\uff0c\u811a\u672c\u4e2d\u7684\u547d\u4ee4\u5219\u662f\u7531\u53e6\u5916\u4e00\u4e2a\u975e\u4e92\u52a8\u6a21\u5f0f\u7684\u5b50 shell (sub shell)\u6765\u6267\u884c\u7684\u3002\u4e5f\u5c31\u662f primary shell \u4ea7\u751f sub shell \u7684\u8fdb\u7a0b\uff0csub shell \u518d\u4ea7\u751f script \u4e2d\u6240\u6709\u547d\u4ee4\u7684\u8fdb\u7a0b\u3002<\/p>\n<p>\u8fd9\u91cc\uff0c\u6211\u4eec\u5fc5\u987b\u77e5\u9053\uff1akernel \u4e0e shell \u662f\u4e0d\u540c\u7684\u4e24\u5957\u8f6f\u4ef6\uff0c\u800c\u4e14\u90fd\u662f\u53ef\u4ee5\u88ab\u66ff\u6362\u7684\uff1a<\/p>\n<p>* \u4e0d\u540c\u7684\u64cd\u4f5c\u7cfb\u7edf\u4f7f\u7528\u4e0d\u540c\u7684 kernel \uff0c<\/p>\n<p>* \u800c\u5728\u540c\u4e00\u4e2a kernel \u4e4b\u4e0a\uff0c\u4e5f\u53ef\u4f7f\u7528\u4e0d\u540c\u7684 shell \u3002<\/p>\n<p>\u5728 Linux \u7684\u9884\u8bbe\u7cfb\u7edf\u4e2d\uff0c\u901a\u5e38\u90fd\u53ef\u4ee5\u627e\u5230\u597d\u51e0\u79cd\u4e0d\u540c\u7684 shell \uff0c\u4e14\u901a\u5e38\u4f1a\u88ab\u5217\u4e8e\u5982\u4e0b\u6863\u6848\u91cc\uff1a\/etc\/shells\u4e0d\u540c\u7684 shell \u6709\u7740\u4e0d\u540c\u7684\u529f\u80fd\uff0c\u4e14\u4e5f\u5f7c\u6b64\u5404\u5f02\uff0c\u6216\u8bf4\u201c\u5927\u540c\u5c0f\u5f02\u201d\u3002<\/p>\n<p>[*]\u5e38\u89c1\u7684 shell \u4e3b\u8981\u5206\u4e3a\u4e24\u5927\u4e3b\u6d41\uff1a<\/p>\n<p>sh\uff1a<\/p>\n<p>burne shell (sh)<\/p>\n<p>burne again shell (bash)<\/p>\n<p>csh\uff1a<\/p>\n<p>c shell (csh)<\/p>\n<p>tc shell (tcsh)<\/p>\n<p>korn shell (ksh)<\/p>\n<p>[*]\u5927\u90e8\u4efd\u7684 Linux \u7cfb\u7edf\u7684\u9884\u8bbe shell \u90fd\u662f bash \uff0c\u5176\u539f\u56e0\u5927\u81f4\u5982\u4e0b\u4e24\u70b9\uff1a<\/p>\n<p>* \u81ea\u7531\u8f6f\u4ef6<\/p>\n<p>* \u529f\u80fd\u5f3a\u5927<\/p>\n<p>bash \u662f gnu project \u6700\u6210\u529f\u7684\u4ea7\u54c1\u4e4b\u4e00\uff0c\u81ea\u63a8\u51fa\u4ee5\u6765\u6df1\u53d7\u5e7f\u5927 Unix \u7528\u6237\u559c\u7231\uff0c\u4e14\u4e5f\u9010\u6e10\u6210\u4e3a\u4e0d\u5c11\u7ec4\u7ec7\u7684\u7cfb\u7edf\u6807\u51c6\u3002<\/p>\n<h1>2 shell prompt(PS1) \u4e0e Carriage Return(CR) \u7684\u5173\u7cfb\uff1f<\/h1>\n<p>\u5f53\u4f60\u6210\u529f\u767b\u5f55\u8fdb\u4e00\u4e2a\u6587\u5b57\u754c\u9762\u4e4b\u540e\uff0c\u5927\u90e8\u4efd\u60c5\u5f62\u4e0b\uff0c\u4f60\u4f1a\u5728\u5c4f\u5e55\u4e0a\u770b\u5230\u4e00\u4e2a\u4e0d\u65ad\u95ea\u70c1\u7684\u65b9\u5757\u6216\u5e95\u7ebf(\u89c6\u4e0d\u540c\u7248\u672c\u800c\u522b)\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a*\u5149\u6807*(cursor)\u3002\u5149\u6807\u7684\u4f5c\u7528\u5c31\u662f\u544a\u8bc9\u4f60\u63a5\u4e0b\u6765\u4f60\u4ece\u952e\u76d8\u8f93\u5165\u7684\u6309\u952e\u6240\u63d2\u5165\u7684\u4f4d\u7f6e\uff0c\u4e14\u6bcf\u8f93\u5982\u4e00\u952e\u5149\u6807\u4fbf\u5411\u53f3\u8fb9\u79fb\u52a8\u4e00\u683c\uff0c\u82e5\u8fde\u7eed\u8f93\u5165\u592a\u591a\u7684\u8bdd\uff0c\u5219\u81ea\u52a8\u63a5\u5728\u4e0b\u4e00\u884c\u8f93\u5165\u3002<\/p>\n<p>\u5047\u5982\u4f60\u521a\u5b8c\u6210\u767b\u5f55\u8fd8\u6ca1\u8f93\u5165\u4efb\u4f55\u6309\u952e\u4e4b\u524d\uff0c\u4f60\u6240\u770b\u5230\u7684\u5149\u6807\u6240\u5728\u4f4d\u7f6e\u7684\u540c\u4e00\u884c\u7684\u5de6\u8fb9\u90e8\u4efd\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a*\u63d0\u793a\u7b26*(prompt)\u3002\u63d0\u793a\u7b26\u53f7\u7684\u683c\u5f0f\u56e0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u800c\u5404\u6709\u4e0d\u540c\uff0c\u5728 Linux \u4e0a\uff0c\u53ea\u9700\u7559\u610f\u6700\u63a5\u8fd1\u5149\u6807\u7684\u4e00\u4e2a\u53ef\u89c1\u7684\u63d0\u793a\u7b26\u53f7\uff0c\u901a\u5e38\u662f\u5982\u4e0b\u4e24\u8005\u4e4b\u4e00\uff1a<\/p>\n<p>$\uff1a\u7ed9\u4e00\u822c\u4f7f\u7528\u8005\u8d26\u53f7\u4f7f\u7528<\/p>\n<p>#\uff1a\u7ed9 root (\u7ba1\u7406\u5458)\u8d26\u53f7\u4f7f\u7528<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0cshell prompt \u7684\u610f\u601d\u5f88\u7b80\u5355\uff1a<\/p>\n<p>* \u662f shell \u544a\u8bc9\u4f7f\u7528\u8005\uff1a\u60a8\u73b0\u5728\u53ef\u4ee5\u8f93\u5165\u547d\u4ee4\u884c\u4e86\u3002<\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u8bf4\uff0c\u4f7f\u7528\u8005\u53ea\u6709\u5728\u5f97\u5230 shell prompt \u624d\u80fd\u6253\u547d\u4ee4\u884c\uff0c\u800c cursor \u662f\u6307\u793a\u952e\u76d8\u5728\u547d\u4ee4\u884c\u6240\u8f93\u5165\u7684\u4f4d\u7f6e\uff0c\u4f7f\u7528\u8005\u6bcf\u8f93\u5165\u4e00\u4e2a\u952e\uff0ccursor \u5c31\u5f80\u540e\u79fb\u52a8\u4e00\u683c\uff0c\u76f4\u5230\u78b0\u5230\u547d\u4ee4\u884c\u8bfb\u8fdb CR(Carriage Return\uff0c\u7531 Enter \u952e\u4ea7\u751f)\u5b57\u7b26\u4e3a\u6b62\u3002<\/p>\n<p>CR \u7684\u610f\u601d\u4e5f\u5f88\u7b80\u5355\uff1a<\/p>\n<p>* \u662f\u4f7f\u7528\u8005\u544a\u8bc9 shell\uff1a\u8001\u5144\u4f60\u53ef\u4ee5\u6267\u884c\u6211\u7684\u547d\u4ee4\u884c\u4e86\u3002<\/p>\n<p>\u4e25\u683c\u6765\u8bf4\uff1a<\/p>\n<p>* \u6240\u8c13\u7684<strong>\u547d\u4ee4\u884c<\/strong>\uff0c\u5c31\u662f\u5728 shell prompt \u4e0e CR \u5b57\u7b26\u4e4b\u95f4\u6240\u8f93\u5165\u7684\u6587\u5b57\u3002<\/p>\n<p>(\u601d\u8003\uff1a\u4e3a\u4f55\u6211\u4eec\u8fd9\u91cc\u575a\u6301\u4f7f\u7528 CR \u5b57\u7b26\u800c\u4e0d\u8bf4 Enter \u952e\u5462\uff1f\u7b54\u6848\u5728\u540e\u9762\u7684\u5b66\u4e60\u4e2d\u63ed\u6653)<\/p>\n<p>\u4e0d\u540c\u7684\u547d\u4ee4\u53ef\u63a5\u53d7\u7684\u547d\u4ee4\u884c\u683c\u5f0f\u6216\u6709\u4e0d\u540c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u4e00\u4e2a\u6807\u51c6\u7684\u547d\u4ee4\u884c\u683c\u5f0f\u4e3a\u5982\u4e0b\u6240\u5217\uff1a<\/p>\n<p>Command-name\u00a0 Options\u00a0 Argument<\/p>\n<p>\u82e5\u4ece\u6280\u672f\u7ec6\u8282\u6765\u770b\uff0cshell \u4f1a\u4f9d\u636e IFS(Internal Field Seperator) \u5c06 command line \u6240\u8f93\u5165\u7684\u6587\u5b57\u7ed9\u62c6\u89e3\u4e3a*\u8bcd*(word)\u3002\u7136\u540e\u518d\u9488\u5bf9\u7279\u6b8a\u5143\u5b57\u7b26(meta)\u5148\u4f5c\u5904\u7406\uff0c\u6700\u540e\u518d\u91cd\u7ec4\u6574\u884c command line \u3002 (\u6ce8\u610f\uff1a\u8bf7\u52a1\u5fc5\u7406\u89e3\u4e0a\u4e24\u53e5\u8bdd\uff0c\u6211\u4eec\u65e5\u540e\u7684\u5b66\u4e60\u4e2d\u4f1a\u5e38\u56de\u5230\u8fd9\u91cc\u601d\u8003)\u5176\u4e2d\u7684 IFS \u662f shell \u9884\u8bbe\u4f7f\u7528\u7684\u5b57\u6bb5\u5206\u9694\u7b26\uff0c\u53ef\u4ee5\u7531\u4e00\u4e2a\u53ca\u591a\u4e2a\u5982\u4e0b\u6309\u952e\u7ec4\u6210\uff1a<\/p>\n<p>* \u7a7a\u683c\u952e(White Space)<\/p>\n<p>* \u8868\u683c\u952e(Tab)<\/p>\n<p>* \u56de\u8f66\u952e(Enter)<\/p>\n<p>\u7cfb\u7edf\u53ef\u63a5\u53d7\u7684\u547d\u4ee4\u540d\u79f0(command-name)\u53ef\u4ee5\u4ece\u5982\u4e0b\u9014\u5f84\u83b7\u5f97\uff1a<\/p>\n<p>* \u660e\u786e\u8def\u5f84\u6240\u6307\u5b9a\u7684\u5916\u90e8\u547d\u4ee4<\/p>\n<p>* \u547d\u4ee4\u522b\u540d(alias)<\/p>\n<p>* \u81ea\u5b9a\u529f\u80fd(function)<\/p>\n<p>* shell \u5185\u5efa\u547d\u4ee4(built-in)<\/p>\n<p>* $PATH \u4e4b\u4e0b\u7684\u5916\u90e8\u547d\u4ee4<\/p>\n<p>\u6bcf\u4e00\u4e2a\u547d\u4ee4\u884c\u5747\u5fc5\u9700\u542b\u7528\u547d\u4ee4\u540d\u79f0\uff0c\u8fd9\u662f\u4e0d\u80fd\u7f3a\u5c11\u7684\u3002<\/p>\n<h1>3 \u522b\u4eba echo\u3001\u4f60\u4e5f echo \uff0c\u662f\u95ee echo \u77e5\u591a\u5c11\uff1f<\/h1>\n<p>\u8fd9\u91cc\u6211\u4eec\u7528 echo \u8fd9\u4e2a\u547d\u4ee4\u52a0\u4ee5\u8fdb\u4e00\u6b65\u8bf4\u660e\u3002\u6807\u51c6\u7684 command line \u5305\u542b\u4e09\u4e2a\u90e8\u4ef6\uff1a<\/p>\n<p>Command-name\u00a0 Options\u00a0 Argument<\/p>\n<p>echo \u662f\u4e00\u4e2a\u975e\u5e38\u7b80\u5355\u3001\u76f4\u63a5\u7684 Linux \u547d\u4ee4\uff1a\u5c06 argument \u9001\u51fa\u81f3\u6807\u51c6\u8f93\u51fa(STDOUT)\uff0c\u901a\u5e38\u5c31\u662f\u5728\u76d1\u89c6\u5668(monitor)\u4e0a\u8f93\u51fa\u3002(\u6ce8\uff1astdout \u6211\u4eec\u65e5\u540e\u6709\u673a\u4f1a\u518d\u89e3\u8bf4\uff0c\u6216\u53ef\u5148\u53c2\u8003\u5982\u4e0b\u8ba8\u8bba\uff1ahttp:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=191375 )<\/p>\n<p>\u4e3a\u4e86\u66f4\u597d\u7406\u89e3\uff0c\u4e0d\u5982\u5148\u8ba9\u6211\u4eec\u5148\u8dd1\u4e00\u4e0b echo \u547d\u4ee4\u597d\u4e86\uff1a<\/p>\n<table style=\"height: 34px;\" width=\"264\">\n<tbody>\n<tr>\n<td width=\"568\">$ echo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4f60\u4f1a\u53d1\u73b0\u53ea\u6709\u4e00\u4e2a\u7a7a\u767d\u884c\uff0c\u7136\u540e\u53c8\u56de\u5230 shell prompt \u4e0a\u4e86\u3002\u8fd9\u662f\u56e0\u4e3a echo \u5728\u9884\u8bbe\u4e0a\uff0c\u5728\u663e\u793a\u5b8c argument \u4e4b\u540e\uff0c\u8fd8\u4f1a\u9001\u51fa\u4e00\u4e2a\u6362\u884c\u7b26(new-line charactor)\u3002\u4f46\u662f\u4e0a\u9762\u7684 command \u5e76\u6ca1\u4efb\u4f55\u7684 argument \uff0c\u90a3\u7ed3\u679c\u5c31\u53ea\u5269\u4e00\u4e2a\u6362\u884c\u7b26\u53f7\u4e86\uff0c\u82e5\u4f60\u8981\u53d6\u6d88\u8fd9\u4e2a\u6362\u884c\u7b26\u53f7\uff0c\u53ef\u5229\u7528 echo \u7684 -n option \uff1a<\/p>\n<table style=\"height: 44px;\" width=\"299\">\n<tbody>\n<tr>\n<td width=\"568\">$ echo \u2013n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0d\u59a8\u8ba9\u6211\u4eec\u56de\u5230 command line \u7684\u6982\u5ff5\u4e0a\u6765\u8ba8\u8bba\u4e0a\u4f8b\u7684 echo \u547d\u4ee4\u597d\u4e86\uff1a command line \u53ea\u6709 command_name(echo) \u53ca option(-n)\uff0c\u5e76\u6ca1\u6709\u4efb\u4f55 argument \u3002\u8981\u60f3\u770b\u770b echo \u7684 argument \uff0c\u90a3\u8fd8\u4e0d\u7b80\u5355\ufe57\u63a5\u4e0b\u6765\uff0c\u4f60\u53ef\u8bd5\u8bd5\u5982\u4e0b\u7684\u8f93\u5165\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo first linefirst line<\/p>\n<p>$ echo -n first line<\/p>\n<p>first line $<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e8e\u4e0a\u4e24\u4e2a echo \u547d\u4ee4\u4e2d\uff0c\u4f60\u4f1a\u53d1\u73b0 argument \u7684\u90e8\u4efd\u663e\u793a\u5728\u4f60\u7684\u5c4f\u5e55\uff0c\u800c\u6362\u884c\u7b26\u53f7\u5219\u89c6 -n option \u7684\u6709\u65e0\u800c\u522b\u3002\u5f88\u660e\u663e\u7684\uff0c\u7b2c\u4e8c\u4e2a echo \u7531\u4e8e\u6362\u884c\u7b26\u53f7\u88ab\u53d6\u6d88\u4e86\uff0c\u63a5\u4e0b\u6765\u7684 shell prompt \u5c31\u63a5\u5728\u8f93\u51fa\u7ed3\u679c\u540c\u4e00\u884c\u4e86\u3002<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0cecho \u9664\u4e86 -n options \u4e4b\u5916\uff0c\u5e38\u7528\u9009\u9879\u8fd8\u6709\uff1a<\/p>\n<p>-e\uff1a\u542f\u7528\u53cd\u659c\u7ebf\u63a7\u5236\u5b57\u7b26\u7684\u8f6c\u6362(\u53c2\u8003\u4e0b\u8868)<\/p>\n<p>-E\uff1a\u5173\u95ed\u53cd\u659c\u7ebf\u63a7\u5236\u5b57\u7b26\u7684\u8f6c\u6362(\u9884\u8bbe\u5982\u6b64)<\/p>\n<p>-n\uff1a\u53d6\u6d88\u884c\u672b\u4e4b\u6362\u884c\u7b26\u53f7(\u4e0e -e \u9009\u9879\u4e0b\u7684 c \u5b57\u7b26\u540c\u4e49)<\/p>\n<p>\u5173\u4e8e echo \u547d\u4ee4\u6240\u652f\u6301\u7684\u53cd\u659c\u7ebf\u63a7\u5236\u5b57\u7b26\u5982\u4e0b\u8868\uff1a<\/p>\n<p>a\uff1aALERT \/ BELL (\u4ece\u7cfb\u7edf\u5587\u53ed\u9001\u51fa\u94c3\u58f0)<\/p>\n<p>b\uff1aBACKSPACE \uff0c\u4e5f\u5c31\u662f\u5411\u5de6\u5220\u9664\u952e<\/p>\n<p>c\uff1a\u53d6\u6d88\u884c\u672b\u4e4b\u6362\u884c\u7b26\u53f7<\/p>\n<p>E\uff1aESCAPE\uff0c\u8df3\u8131\u952e<\/p>\n<p>f\uff1aFORMFEED\uff0c\u6362\u9875\u5b57\u7b26<\/p>\n<p>n\uff1aNEWLINE\uff0c\u6362\u884c\u5b57\u7b26<\/p>\n<p>r\uff1aRETURN\uff0c\u56de\u8f66\u952e<\/p>\n<p>t\uff1aTAB\uff0c\u8868\u683c\u8df3\u4f4d\u952e<\/p>\n<p>v\uff1aVERTICAL TAB\uff0c\u5782\u76f4\u8868\u683c\u8df3\u4f4d\u952e<\/p>\n<p>n\uff1aASCII \u516b\u8fdb\u4f4d\u7f16\u7801(\u4ee5 x \u5f00\u9996\u4e3a\u5341\u516d\u8fdb\u5236)<\/p>\n<p>\\\uff1a\u53cd\u659c\u7ebf\u672c\u8eab<\/p>\n<p>(\u8868\u683c\u6570\u636e\u6765\u81ea O&#8217;Reilly \u51fa\u7248\u793e\u4e4b Learning the Bash Shell, 2nd Ed.)<\/p>\n<p>\u6216\u8bb8\uff0c\u6211\u4eec\u53ef\u4ee5\u900f\u8fc7\u5b9e\u4f8b\u6765\u4e86\u89e3 echo \u7684\u9009\u9879\u53ca\u63a7\u5236\u5b57\u7b26\uff1a<\/p>\n<p>\u4f8b\u4e00\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo -e &#8220;atbtcndtetf&#8221;a\u00a0 \u00a0\u00a0 \u00a0 b\u00a0 \u00a0\u00a0 \u00a0 c<\/p>\n<p>d\u00a0 \u00a0\u00a0 \u00a0 e\u00a0 \u00a0\u00a0 \u00a0 f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u4f8b\u8fd0\u7528 t \u6765\u533a\u9694 abc \u8fd8\u6709 def \uff0c\u53ca\u7528 n \u5c06 def \u6362\u81f3\u4e0b\u4e00\u884c\u3002<\/p>\n<p>\u4f8b\u4e8c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo -e &#8220;141\u000011142\u000011143\u000012144\u000011145\u000011146&#8243;a\u00a0 \u00a0\u00a0 \u00a0 b\u00a0 \u00a0\u00a0 \u00a0 c<\/p>\n<p>d\u00a0 \u00a0\u00a0 \u00a0 e\u00a0 \u00a0\u00a0 \u00a0 f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0e\u4f8b\u4e00\u7684\u7ed3\u679c\u4e00\u6837\uff0c\u53ea\u662f\u4f7f\u7528 ASCII \u516b\u8fdb\u4f4d\u7f16\u7801\u3002<\/p>\n<p>\u4f8b\u4e09\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo -e &#8220;x61x09x62x09x63x0ax64x09x65x09x66&#8243;a\u00a0 \u00a0\u00a0 \u00a0 b\u00a0 \u00a0\u00a0 \u00a0 c<\/p>\n<p>d\u00a0 \u00a0\u00a0 \u00a0 e\u00a0 \u00a0\u00a0 \u00a0 f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0e\u4f8b\u4e8c\u5dee\u4e0d\u591a\uff0c\u53ea\u662f\u8fd9\u6b21\u6362\u7528 ASCII \u5341\u516d\u8fdb\u5236\u7f16\u7801\u3002<\/p>\n<p>\u4f8b\u56db\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo -ne &#8220;atbtcndtebfa&#8221;a\u00a0 \u00a0\u00a0 \u00a0 b\u00a0 \u00a0\u00a0 \u00a0 c<\/p>\n<p>d\u00a0 \u00a0\u00a0 \u00a0 f $<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u56e0\u4e3a e \u5b57\u6bcd\u540e\u9762\u662f\u5220\u9664\u952e(b)\uff0c\u56e0\u6b64\u8f93\u51fa\u7ed3\u679c\u5c31\u6ca1\u6709 e \u4e86\u3002\u5728\u7ed3\u675f\u65f6\u542c\u5230\u4e00\u58f0\u94c3\u5411\uff0c\u90a3\u662f a \u7684\u6770\u4f5c\ufe57\u7531\u4e8e\u540c\u65f6\u4f7f\u7528\u4e86 -n \u9009\u9879\uff0c\u56e0\u6b64 shell prompt \u7d27\u63a5\u5728\u7b2c\u4e8c\u884c\u4e4b\u540e\u3002\u82e5\u4f60\u4e0d\u7528 -n \u7684\u8bdd\uff0c\u90a3\u4f60\u5728 a \u540e\u518d\u52a0\u4e2a c \uff0c\u4e5f\u662f\u540c\u6837\u7684\u6548\u679c\u3002<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u5728\u65e5\u540e\u7684 shell \u64cd\u4f5c\u53ca shell script \u8bbe\u8ba1\u4e0a\uff0cecho \u547d\u4ee4\u662f\u6700\u5e38\u88ab\u4f7f\u7528\u7684\u547d\u4ee4\u4e4b\u4e00\u3002\u6bd4\u65b9\u8bf4\uff0c\u7528 echo \u6765\u68c0\u67e5\u53d8\u91cf\u503c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B$ echo $A<\/p>\n<p>B<\/p>\n<p>$ echo $?<\/p>\n<p>0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u597d\u4e86\uff0c\u66f4\u591a\u7684\u5173\u4e8e command line \u7684\u683c\u5f0f\uff0c\u4ee5\u53ca echo \u547d\u4ee4\u7684\u9009\u9879\uff0c\u5c31\u8bf7\u60a8\u81ea\u884c\u591a\u52a0\u7ec3\u4e60\u3001\u8fd0\u7528\u4e86.<\/p>\n<h1>4 &#8221; &#8220;(\u53cc\u5f15\u53f7) \u4e0e &#8216; &#8216;(\u5355\u5f15\u53f7)\u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u8fd8\u662f\u56de\u5230\u6211\u4eec\u7684 command line \u6765\u5427\u3002\u7ecf\u8fc7\u524d\u9762\u4e24\u7ae0\u7684\u5b66\u4e60\uff0c\u5e94\u8be5\u5f88\u6e05\u695a\u5f53\u4f60\u5728 shell prompt \u540e\u9762\u6572\u6253\u952e\u76d8\u3001\u76f4\u5230\u6309\u4e0b Enter \u65f6\uff0c\u4f60\u8f93\u5165\u7684\u6587\u5b57\u5c31\u662f command line \u4e86\uff0c\u7136\u540e shell \u624d\u4f1a\u4ee5\u8fdb\u7a0b\u7684\u65b9\u5f0f\u6267\u884c\u4f60\u6240\u4ea4\u7ed9\u5b83\u7684\u547d\u4ee4\u3002\u4f46\u662f\uff0c\u4f60\u53ef\u77e5\u9053\uff1a\u4f60\u5728 command line \u8f93\u5165\u7684\u6bcf\u4e00\u4e2a\u6587\u5b57\uff0c\u5bf9 shell \u6765\u8bf4\uff0c\u662f\u6709\u7c7b\u522b\u4e4b\u5206\u7684\u5462\uff1f\u7b80\u5355\u800c\u8a00(\u6211\u4e0d\u6562\u8bf4\u8fd9\u662f\u7cbe\u786e\u7684\u5b9a\u8bae\uff0c\u6ce8\u4e00)\uff0ccommand line \u7684\u6bcf\u4e00\u4e2a charactor \uff0c\u5206\u4e3a\u5982\u4e0b\u4e24\u79cd\uff1a<\/p>\n<p>*literal\uff1a\u4e5f\u5c31\u662f\u666e\u901a\u7eaf\u6587\u5b57\uff0c\u5bf9 shell \u6765\u8bf4\u6ca1\u7279\u6b8a\u529f\u80fd\u3002<\/p>\n<p>* meta\uff1a\u5bf9 shell \u6765\u8bf4\uff0c\u5177\u6709\u7279\u5b9a\u529f\u80fd\u7684\u7279\u6b8a\u4fdd\u7559\u5b57\u7b26\u3002<\/p>\n<p>(\u6ce8\u4e00\uff1a\u5173\u4e8e bash shell \u5728\u5904\u7406 command line \u65f6\u7684\u987a\u5e8f\u8bf4\u660e\uff0c\u8bf7\u53c2\u8003 O&#8217;Reilly \u51fa\u7248\u793e\u4e4b Learning the Bash Shell, 2nd Edition\uff0c\u7b2c 177 &#8211; 180 \u9875\u7684\u8bf4\u660e\uff0c\u5c24\u5176\u662f 178 \u9875\u7684\u6d41\u7a0b\u56fe Figure 7-1)<\/p>\n<p>literal \u6ca1\u751a\u4e48\u597d\u8c08\u7684\uff0c\u51e1\u4e3e abcd\u3001123456 \u8fd9\u4e9b\u201c\u6587\u5b57\u201d\u90fd\u662f literal (easy\uff1f)\uff0c\u4f46 meta \u5374\u5e38\u4f7f\u6211\u4eec\u56f0\u60d1 (confused?)\u3002\u4e8b\u5b9e\u4e0a\uff0c\u524d\u4e24\u7ae0\u6211\u4eec\u5728 command line \u4e2d\u5df2\u78b0\u5230\u4e24\u4e2a\u673a\u4e4e\u6bcf\u6b21\u90fd\u4f1a\u78b0\u5230\u7684 meta \uff1a<\/p>\n<p>* IFS\uff1a\u7531 &lt;space&gt; \u6216 &lt;tab&gt; \u6216 &lt;enter&gt; \u4e09\u8005\u4e4b\u4e00\u7ec4\u6210(\u6211\u4eec\u5e38\u7528 space )\u3002<\/p>\n<p>* CR\uff1a\u7531 &lt;enter&gt; \u4ea7\u751f\u3002<\/p>\n<p>IFS \u662f\u7528\u6765\u62c6\u89e3 command line \u7684\u6bcf\u4e00\u4e2a\u8bcd(word)\u7528\u7684\uff0c\u56e0\u4e3a shell command line \u662f\u6309\u8bcd\u6765\u5904\u7406\u7684\u3002\u800c CR \u5219\u662f\u7528\u6765\u7ed3\u675f command line \u7528\u7684\uff0c\u8fd9\u4e5f\u662f\u4e3a\u4f55\u6211\u4eec\u6572 &lt;enter&gt; \u547d\u4ee4\u5c31\u4f1a\u8dd1\u7684\u539f\u56e0\u3002<\/p>\n<p>\u9664\u4e86 IFS \u4e0e CR \uff0c\u5e38\u7528\u7684 meta \u8fd8\u6709\uff1a<\/p>\n<p>= \u00a0\u00a0 \u8bbe\u5b9a\u53d8\u91cf\u3002<\/p>\n<p>$\u00a0\u00a0\u00a0\u00a0 \u4f5c\u53d8\u91cf\u6216\u8fd0\u7b97\u66ff\u6362(\u8bf7\u4e0d\u8981\u4e0e shell prompt \u641e\u6df7\u4e86)\u3002<\/p>\n<p>&gt;\u00a0\u00a0\u00a0\u00a0 \u91cd\u5bfc\u5411 stdout\u3002<\/p>\n<p>&lt;\u00a0\u00a0\u00a0\u00a0 \u91cd\u5bfc\u5411 stdin\u3002<\/p>\n<p>|\u00a0\u00a0\u00a0\u00a0\u00a0 \u547d\u4ee4\u7ba1\u7ebf\u3002<\/p>\n<p>&amp;\u00a0\u00a0\u00a0 \u91cd\u5bfc\u5411 file descriptor \uff0c\u6216\u5c06\u547d\u4ee4\u7f6e\u4e8e\u540e\u53f0\u6267\u884c\u3002<\/p>\n<p>( )\u00a0\u00a0\u00a0 \u5c06\u5176\u5185\u7684\u547d\u4ee4\u7f6e\u4e8e nested subshell \u6267\u884c\uff0c\u6216\u7528\u4e8e\u8fd0\u7b97\u6216\u547d\u4ee4\u66ff\u6362\u3002<\/p>\n<p>{ }\u00a0\u00a0 \u5c06\u5176\u5185\u7684\u547d\u4ee4\u7f6e\u4e8e non-named function \u4e2d\u6267\u884c\uff0c\u6216\u7528\u5728\u53d8\u91cf\u66ff\u6362\u7684\u754c\u5b9a\u8303\u56f4\u3002<\/p>\n<p>;\u00a0\u00a0\u00a0\u00a0\u00a0 \u5728\u524d\u4e00\u4e2a\u547d\u4ee4\u7ed3\u675f\u65f6\uff0c\u800c\u5ffd\u7565\u5176\u8fd4\u56de\u503c\uff0c\u7ee7\u7eed\u6267\u884c\u4e0b\u4e00\u4e2a\u547d\u4ee4\u3002<\/p>\n<p>&amp;&amp;\u00a0 \u5728\u524d\u4e00\u4e2a\u547d\u4ee4\u7ed3\u675f\u65f6\uff0c\u82e5\u8fd4\u56de\u503c\u4e3a true\uff0c\u7ee7\u7eed\u6267\u884c\u4e0b\u4e00\u4e2a\u547d\u4ee4\u3002<\/p>\n<p>||\u00a0\u00a0\u00a0\u00a0\u00a0 \u5728\u524d\u4e00\u4e2a\u547d\u4ee4\u7ed3\u675f\u65f6\uff0c\u82e5\u8fd4\u56de\u503c\u4e3a false\uff0c\u7ee7\u7eed\u6267\u884c\u4e0b\u4e00\u4e2a\u547d\u4ee4\u3002<\/p>\n<p>!\u00a0\u00a0\u00a0\u00a0\u00a0 \u6267\u884c history \u5217\u8868\u4e2d\u7684\u547d\u4ee4<\/p>\n<p>\u2026\u2026<\/p>\n<p>\u5047\u5982\u6211\u4eec\u9700\u8981\u5728 command line \u4e2d\u5c06\u8fd9\u4e9b\u4fdd\u7559\u5b57\u7b26\u7684\u529f\u80fd\u5173\u95ed\u7684\u8bdd\uff0c\u5c31\u9700\u8981 quoting \u5904\u7406\u4e86\u3002\u5728 bash \u4e2d\uff0c\u5e38\u7528\u7684 quoting \u6709\u5982\u4e0b\u4e09\u79cd\u65b9\u6cd5\uff1a<\/p>\n<p>* hard quote\uff1a&#8217; &#8216; (\u5355\u5f15\u53f7)\uff0c\u51e1\u5728 hard quote \u4e2d\u7684\u6240\u6709 meta \u5747\u88ab\u5173\u95ed\u3002<\/p>\n<p>* soft quote\uff1a &#8221; &#8221; (\u53cc\u5f15\u53f7)\uff0c\u5728 soft quoe \u4e2d\u5927\u90e8\u4efd meta \u90fd\u4f1a\u88ab\u5173\u95ed\uff0c\u4f46\u67d0\u4e9b\u5219\u4fdd\u7559(\u5982 $ )\u3002(\u6ce8\u4e8c)<\/p>\n<p>* escape \uff1a  (\u53cd\u659c\u7ebf)\uff0c\u53ea\u6709\u7d27\u63a5\u5728 escape (\u8df3\u8131\u5b57\u7b26)\u4e4b\u540e\u7684\u5355\u4e00 meta \u624d\u88ab\u5173\u95ed\u3002<\/p>\n<p>( \u6ce8\u4e8c\uff1a\u5728 soft quote \u4e2d\u88ab\u8c41\u514d\u7684\u5177\u4f53 meta \u6e05\u5355\uff0c\u6211\u4e0d\u5b8c\u5168\u77e5\u9053\uff0c\u6709\u5f85\u5927\u5bb6\u8865\u5145\uff0c\u6216\u900f\u8fc7\u5b9e\u4f5c\u6765\u53d1\u73b0\u53ca\u7406\u89e3\u3002 )<\/p>\n<p>\u4e0b\u9762\u7684\u4f8b\u5b50\u5c06\u6709\u52a9\u4e8e\u6211\u4eec\u5bf9 quoting \u7684\u4e86\u89e3\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B C\u00a0 \u00a0 \u00a0 \u00a0 # \u7a7a\u683c\u952e\u672a\u88ab\u5173\u6389\uff0c\u4f5c\u4e3a IFS \u5904\u7406\u3002$ C: command not found.<\/p>\n<p>$ echo $A<\/p>\n<p>$ A=&#8221;B C&#8221;\u00a0 \u00a0 \u00a0 \u00a0 # \u7a7a\u683c\u952e\u5df2\u88ab\u5173\u6389\uff0c\u4ec5\u4f5c\u4e3a\u7a7a\u683c\u952e\u5904\u7406\u3002<\/p>\n<p>$ echo $A<\/p>\n<p>B C<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5728\u7b2c\u4e00\u6b21\u8bbe\u5b9a A \u53d8\u91cf\u65f6\uff0c\u7531\u4e8e\u7a7a\u683c\u952e\u6ca1\u88ab\u5173\u95ed\uff0ccommand line \u5c06\u88ab\u89e3\u8bfb\u4e3a\uff1a<\/p>\n<p>* A=B \u7136\u540e\u78b0\u5230&lt;IFS&gt;\uff0c\u518d\u6267\u884c C \u547d\u4ee4<\/p>\n<p>\u5728\u7b2c\u4e8c\u6b21\u8bbe\u5b9a\u00a0\u00a0A \u53d8\u91cf\u65f6\uff0c\u7531\u4e8e\u7a7a\u683c\u952e\u88ab\u7f6e\u4e8e soft quote \u4e2d\uff0c\u56e0\u6b64\u88ab\u5173\u95ed\uff0c\u4e0d\u518d\u4f5c\u4e3a IFS \uff1a<\/p>\n<p>* A=B&lt;space&gt;C<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u7a7a\u683c\u952e\u65e0\u8bba\u5728 soft quote \u8fd8\u662f\u5728 hard quote \u4e2d\uff0c\u5747\u4f1a\u88ab\u5173\u95ed\u3002Enter \u952e\u4ea6\u7136\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=&#8217;B&gt; C<\/p>\n<p>&gt; &#8216;<\/p>\n<p>$ echo &#8220;$A&#8221;<\/p>\n<p>B<\/p>\n<p>C<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5728\u4e0a\u4f8b\u4e2d\uff0c\u7531\u4e8e &lt;enter&gt; \u88ab\u7f6e\u4e8e hard quote \u5f53\u4e2d\uff0c\u56e0\u6b64\u4e0d\u518d\u4f5c\u4e3a CR \u5b57\u7b26\u6765\u5904\u7406\u3002\u8fd9\u91cc\u7684 &lt;enter&gt; \u5355\u7eaf\u53ea\u662f\u4e00\u4e2a\u65ad\u884c\u7b26\u53f7(new-line)\u800c\u5df2\uff0c\u7531\u4e8e command line \u5e76\u6ca1\u5f97\u5230 CR \u5b57\u7b26\uff0c\u56e0\u6b64\u8fdb\u5165\u7b2c\u4e8c\u4e2a shell prompt (PS2\uff0c\u4ee5 &gt; \u7b26\u53f7\u8868\u793a)\uff0ccommand line \u5e76\u4e0d\u4f1a\u7ed3\u675f\uff0c\u76f4\u5230\u7b2c\u4e09\u884c\uff0c\u6211\u4eec\u8f93\u5165\u7684 &lt;enter&gt; \u5e76\u4e0d\u5728\u00a0\u00a0hard quote \u91cc\u9762\uff0c\u56e0\u6b64\u5e76\u6ca1\u88ab\u5173\u95ed\uff0c\u6b64\u65f6\uff0ccommand line \u78b0\u5230 CR \u5b57\u7b26\uff0c\u4e8e\u662f\u7ed3\u675f\u3001\u4ea4\u7ed9 shell \u6765\u5904\u7406\u3002\u4e0a\u4f8b\u7684 &lt;enter&gt; \u8981\u662f\u88ab\u7f6e\u4e8e soft quote \u4e2d\u7684\u8bdd\uff0c CR \u4e5f\u4f1a\u540c\u6837\u88ab\u5173\u95ed\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=&#8221;B&gt; C<\/p>\n<p>&gt; &#8221;<\/p>\n<p>$ echo $A<\/p>\n<p>B C<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7136\u800c\uff0c\u7531\u4e8e echo $A \u65f6\u7684\u53d8\u91cf\u6ca1\u81f3\u4e8e soft quote \u4e2d\uff0c\u56e0\u6b64\u5f53\u53d8\u91cf\u66ff\u6362\u5b8c\u6210\u540e\u5e76\u4f5c\u547d\u4ee4\u884c\u91cd\u7ec4\u65f6\uff0c&lt;enter&gt; \u4f1a\u88ab\u89e3\u91ca\u4e3a IFS \uff0c\u800c\u4e0d\u662f\u89e3\u91ca\u4e3a New Line \u5b57\u7b26\u3002\u540c\u6837\u7684\uff0c\u7528 escape \u4ea6\u53ef\u5173\u95ed CR \u5b57\u7b26\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B&gt; C<\/p>\n<p>&gt;<\/p>\n<p>$ echo $A<\/p>\n<p>BC<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u4f8b\u4e2d\uff0c\u7b2c\u4e00\u4e2a &lt;enter&gt; \u8ddf\u7b2c\u4e8c\u4e2a &lt;enter&gt; \u5747\u88ab escape \u5b57\u7b26\u5173\u95ed\u4e86\uff0c\u56e0\u6b64\u4e5f\u4e0d\u4f5c\u4e3a CR \u6765\u5904\u7406\uff0c\u4f46\u7b2c\u4e09\u4e2a &lt;enter&gt; \u7531\u4e8e\u6ca1\u88ab\u8df3\u8131\uff0c\u56e0\u6b64\u4f5c\u4e3a CR \u7ed3\u675f command line \u3002\u4f46\u7531\u4e8e &lt;enter&gt; \u952e\u672c\u8eab\u5728 shell meta \u4e2d\u7684\u7279\u6b8a\u6027\uff0c\u5728  \u8df3\u8131\u540e\u9762\uff0c\u4ec5\u4ec5\u53d6\u6d88\u5176 CR \u529f\u80fd\uff0c\u800c\u4e0d\u4f1a\u4fdd\u7559\u5176 IFS \u529f\u80fd\u3002\u60a8\u6216\u8bb8\u53d1\u73b0\u5149\u662f\u4e00\u4e2a &lt;enter&gt; \u952e\u6240\u4ea7\u751f\u7684\u5b57\u7b26\u5c31\u6709\u53ef\u80fd\u662f\u5982\u4e0b\u8fd9\u4e9b\u53ef\u80fd\uff1a<\/p>\n<p>CR<\/p>\n<p>IFS<\/p>\n<p>NL(New Line)<\/p>\n<p>FF(Form Feed)<\/p>\n<p>NULL<\/p>\n<p>\u81f3\u4e8e\u751a\u4e48\u65f6\u5019\u4f1a\u89e3\u91ca\u4e3a\u751a\u4e48\u5b57\u7b26\uff0c\u8fd9\u4e2a\u6211\u5c31\u6ca1\u53bb\u6df1\u6316\u4e86\uff0c\u6216\u662f\u7559\u7ed9\u8bfb\u8005\u8bf8\u541b\u81ea\u884c\u6162\u6162\u6478\u7d22\u4e86\u3002\u81f3\u4e8e soft quote \u8ddf hard quote \u7684\u4e0d\u540c\uff0c\u4e3b\u8981\u662f\u5bf9\u4e8e\u67d0\u4e9b meta \u7684\u5173\u95ed\u4e0e\u5426\uff0c\u4ee5 $ \u6765\u4f5c\u8bf4\u660e\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B C$ echo &#8220;$A&#8221;<\/p>\n<p>B C<\/p>\n<p>$ echo &#8216;$A&#8217;<\/p>\n<p>$A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5728\u7b2c\u4e00\u4e2a echo \u547d\u4ee4\u884c\u4e2d\uff0c$ \u88ab\u7f6e\u4e8e soft quote \u4e2d\uff0c\u5c06\u4e0d\u88ab\u5173\u95ed\uff0c\u56e0\u6b64\u7ee7\u7eed\u5904\u7406\u53d8\u91cf\u66ff\u6362\uff0c\u56e0\u6b64 echo \u5c06 A \u7684\u53d8\u91cf\u503c\u8f93\u51fa\u5230\u5c4f\u5e55\uff0c\u4e5f\u5c31\u5f97\u5230\u00a0\u00a0&#8220;B C&#8221; \u7684\u7ed3\u679c\u3002\u5728\u7b2c\u4e8c\u4e2a echo \u547d\u4ee4\u884c\u4e2d\uff0c$ \u88ab\u7f6e\u4e8e hard quote \u4e2d\uff0c\u5219\u88ab\u5173\u95ed\uff0c\u56e0\u6b64 $ \u53ea\u662f\u4e00\u4e2a $ \u7b26\u53f7\uff0c\u5e76\u4e0d\u4f1a\u7528\u6765\u4f5c\u53d8\u91cf\u66ff\u6362\u5904\u7406\uff0c\u56e0\u6b64\u7ed3\u679c\u662f $ \u7b26\u53f7\u540e\u9762\u63a5\u4e00\u4e2a A \u5b57\u6bcd\uff1a$A \u3002<\/p>\n<p>\u7ec3\u4e60\u4e0e\u601d\u8003\uff1a\u5982\u4e0b\u7ed3\u679c\u4e3a\u4f55\u4e0d\u540c\uff1f<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B C$ echo &#8216;&#8221;$A&#8221;&#8216;\u00a0 \u00a0 \u00a0 \u00a0 # \u6700\u5916\u9762\u7684\u662f\u5355\u5f15\u53f7<\/p>\n<p>&#8220;$A&#8221;<\/p>\n<p>$ echo &#8220;&#8216;$A'&#8221;\u00a0 \u00a0 \u00a0 \u00a0 # \u6700\u5916\u9762\u7684\u662f\u53cc\u5f15\u53f7<\/p>\n<p>&#8216;B C&#8217;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(\u63d0\u793a\uff1a\u5355\u5f15\u53f7\u53ca\u53cc\u5f15\u53f7\uff0c\u5728 quoting \u4e2d\u5747\u88ab\u5173\u4e86)<\/p>\n<p>\u5728 CU \u7684 shell \u7248\u91cc\uff0c\u6211\u53d1\u73b0\u6709\u5f88\u591a\u521d\u5b66\u8005\u7684\u95ee\u9898\uff0c\u90fd\u4e0e quoting \u7406\u89e3\u7684\u6709\u5173\u3002\u6bd4\u65b9\u8bf4\uff0c\u82e5\u6211\u4eec\u5728 awk \u6216 sed \u7684\u547d\u4ee4\u53c2\u6570\u4e2d\u8c03\u7528\u4e4b\u524d\u8bbe\u5b9a\u7684\u4e00\u4e9b\u53d8\u91cf\u65f6\uff0c\u5e38\u4f1a\u95ee\u53ca\u4e3a\u4f55\u4e0d\u80fd\u7684\u95ee\u9898\u3002\u8981\u89e3\u51b3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5173\u952e\u70b9\u5c31\u662f\uff1a<\/p>\n<p>* \u533a\u5206\u51fa shell meta \u4e0e command meta<\/p>\n<p>\u524d\u9762\u6211\u4eec\u63d0\u5230\u7684\u90a3\u4e9b meta \uff0c\u90fd\u662f\u5728 command line \u4e2d\u6709\u7279\u6b8a\u7528\u9014\u7684\uff0c\u6bd4\u65b9\u8bf4 { } \u662f\u5c06\u5176\u5185\u4e00\u7cfb\u5217 command line \u7f6e\u4e8e\u4e0d\u5177\u540d\u7684\u51fd\u6570\u4e2d\u6267\u884c(\u53ef\u7b80\u5355\u89c6\u4e3a command block )\uff0c\u4f46\u662f\uff0cawk \u5374\u9700\u8981\u7528 { } \u6765\u533a\u5206\u51fa awk \u7684\u547d\u4ee4\u533a\u6bb5(BEGIN, MAIN, END)\u3002\u82e5\u4f60\u5728 command line \u4e2d\u5982\u6b64\u8f93\u5165\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">CODE:$ awk {print $0} 1.txt<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7531\u4e8e\u00a0\u00a0{ } \u5728 shell \u4e2d\u5e76\u6ca1\u5173\u95ed\uff0c\u90a3 shell \u5c31\u5c06 {print $0} \u89c6\u4e3a command block \uff0c\u4f46\u540c\u65f6\u53c8\u6ca1\u6709&#8221; ; &#8220;\u7b26\u53f7\u4f5c\u547d\u4ee4\u533a\u9694\uff0c\u56e0\u6b64\u5c31\u51fa\u73b0 awk \u7684\u8bed\u6cd5\u9519\u8bef\u7ed3\u679c\u3002\u8981\u89e3\u51b3\u4e4b\uff0c\u53ef\u7528 hard quote \uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ awk &#8216;{print $0}&#8217; 1.txt<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u9762\u7684 hard quote \u5e94\u597d\u7406\u89e3\uff0c\u5c31\u662f\u5c06\u539f\u672c\u7684 {\u3001&lt;space&gt;\u3001$(\u6ce8\u4e09)\u3001} \u8fd9\u51e0\u4e2a shell meta \u5173\u95ed\uff0c\u907f\u514d\u6389\u5728 shell \u4e2d\u906d\u5230\u5904\u7406\uff0c\u800c\u5b8c\u6574\u7684\u6210\u4e3a awk \u53c2\u6570\u4e2d\u7684 command meta \u3002 ( \u6ce8\u4e09\uff1a\u800c\u5176\u4e2d\u7684 $0 \u662f awk \u5185\u5efa\u7684 field number \uff0c\u800c\u975e\u00a0\u00a0awk \u7684\u53d8\u91cf\uff0cawk \u81ea\u8eab\u7684\u53d8\u91cf\u65e0\u9700\u4f7f\u7528 $ )\u8981\u662f\u7406\u89e3\u4e86 hard quote \u7684\u529f\u80fd\uff0c\u518d\u6765\u7406\u89e3 soft quote \u4e0e escape \u5c31\u4e0d\u96be\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">awk &#8220;{print $0}&#8221; 1.txtawk {print $0} 1.txt<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7136\u800c\uff0c\u82e5\u4f60\u8981\u6539\u53d8 awk \u7684 $0 \u7684 0 \u503c\u662f\u4ece\u53e6\u4e00\u4e2a shell \u53d8\u91cf\u8bfb\u8fdb\u5462\uff1f\u6bd4\u65b9\u8bf4\uff1a\u5df2\u6709\u53d8\u91cf $A \u7684\u503c\u662f 0 \uff0c\u90a3\u5982\u4f55\u5728 command line \u4e2d\u89e3\u51b3 awk \u7684 $$A \u5462\uff1f\u4f60\u53ef\u4ee5\u5f88\u76f4\u63a5\u5426\u5b9a\u6389 hard quoe \u7684\u65b9\u6848\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ awk &#8216;{print $$A}&#8217; 1.txt<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u90a3\u662f\u56e0\u4e3a $A \u7684 $ \u5728 hard quote \u4e2d\u662f\u4e0d\u80fd\u66ff\u6362\u53d8\u91cf\u7684\u3002\u806a\u660e\u7684\u8bfb\u8005(\u5982\u4f60!)\uff0c\u7ecf\u8fc7\u672c\u7ae0\u5b66\u4e60\uff0c\u6211\u60f3\uff0c\u5e94\u8be5\u53ef\u4ee5\u89e3\u91ca\u4e3a\u4f55\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528\u5982\u4e0b\u64cd\u4f5c\u4e86\u5427\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">A=0awk &#8220;{print $$A}&#8221; 1.txt<\/p>\n<p>awk {print $$A} 1.txt<\/p>\n<p>awk &#8216;{print $&#8217;$A&#8217;}&#8217; 1.txt<\/p>\n<p>awk &#8216;{print $'&#8221;$A&#8221;&#8216;}&#8217; 1.txt\u00a0 \u00a0\u00a0\u00a0# \u6ce8\uff1a&#8221;$A&#8221; \u5305\u5728 soft quote \u4e2d<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6216\u8bb8\uff0c\u4f60\u80fd\u4e3e\u51fa\u66f4\u591a\u7684\u65b9\u6848\u5462\u3002<\/p>\n<p>\u7ec3\u4e60\u4e0e\u601d\u8003\uff1a\u8bf7\u8fd0\u7528\u672c\u7ae0\u5b66\u5230\u7684\u77e5\u8bc6\u5206\u6790\u5982\u4e0b\u4e24\u4e32\u8ba8\u8bba\uff1a<\/p>\n<p><a href=\"http:\/\/bbs.chinaunix.net\/forum\/viewtopic.php?t=207178\">http:\/\/bbs.chinaunix.net\/forum\/viewtopic.php?t=207178<\/a><\/p>\n<p><a href=\"http:\/\/bbs.chinaunix.net\/forum\/viewtopic.php?t=216729\">http:\/\/bbs.chinaunix.net\/forum\/viewtopic.php?t=216729<\/a><\/p>\n<h1>5 var=value\uff1fexport \u524d\u540e\u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u8fd9\u6b21\u8ba9\u6211\u4eec\u6682\u65f6\u4e22\u5f00 command line \uff0c\u5148\u6765\u4e86\u89e3\u4e00\u4e0b bash \u53d8\u91cf(variable)\u5427.\u6240\u8c13\u7684<strong>\u53d8\u91cf<\/strong>\uff0c\u5c31\u662f\u5c31\u662f\u5229\u7528\u4e00\u4e2a\u7279\u5b9a\u7684\u201c\u540d\u79f0\u201d(name)\u6765\u5b58\u53d6\u4e00\u6bb5\u53ef\u4ee5\u53d8\u5316\u7684\u201c\u503c\u201d (value)\u3002<\/p>\n<p>\u5728 bash \u4e2d\uff0c\u4f60\u53ef\u4ee5\u7528\u201c=\u201d\u6765\u8bbe\u5b9a\u6216\u91cd\u65b0\u5b9a\u4e49\u53d8\u91cf\u7684\u5185\u5bb9\uff1a<\/p>\n<p>name=value<\/p>\n<p>\u5728\u8bbe\u5b9a\u53d8\u91cf\u7684\u65f6\u4faf\uff0c\u5f97\u9075\u5b88\u5982\u4e0b<strong>\u89c4\u5219<\/strong>\uff1a<\/p>\n<p>* \u7b49\u53f7\u5de6\u53f3\u4e24\u8fb9\u4e0d\u80fd\u4f7f\u7528\u533a\u9694\u7b26\u53f7(IFS)\uff0c\u4e5f\u5e94\u907f\u514d\u4f7f\u7528 shell \u7684\u4fdd\u7559\u5b57\u7b26(meta charactor)\u3002<\/p>\n<p>* \u53d8\u91cf\u540d\u79f0\u4e0d\u80fd\u4f7f\u7528 $ \u7b26\u53f7\u3002<\/p>\n<p>* \u53d8\u91cf\u540d\u79f0\u7684\u7b2c\u4e00\u4e2a\u5b57\u6bcd\u4e0d\u80fd\u662f\u6570\u5b57(number)\u3002<\/p>\n<p>* \u53d8\u91cf\u540d\u79f0\u957f\u5ea6\u4e0d\u53ef\u8d85\u8fc7 256 \u4e2a\u5b57\u6bcd\u3002<\/p>\n<p>* \u53d8\u91cf\u540d\u79f0\u53ca\u53d8\u91cf\u503c\u4e4b\u5927\u5c0f\u5199\u662f\u6709\u533a\u522b\u7684(case sensitive)\u3002<\/p>\n<p>\u5982\u4e0b\u662f\u4e00\u4e9b\u53d8\u91cf\u8bbe\u5b9a\u65f6\u5e38\u89c1\u7684\u9519\u8bef\uff1a<\/p>\n<p>A= B\u00a0 \u00a0 \u00a0 \u00a0\u00a0\u00a0\u00a0 \u4e0d\u80fd\u6709 IFS<\/p>\n<p>1A=B\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u4e0d\u80fd\u4ee5\u6570\u5b57\u5f00\u5934<\/p>\n<p>$A=B\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u540d\u79f0\u4e0d\u80fd\u6709 $<\/p>\n<p>a=B\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u8fd9\u8ddf a=b \u662f\u4e0d\u540c\u7684<\/p>\n<p>\u5982\u4e0b\u5219\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\u8bbe\u5b9a\uff1a<\/p>\n<p>A=&#8221; B&#8221;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 IFS \u88ab\u5173\u95ed\u4e86 (\u8bf7\u53c2\u8003\u524d\u9762\u7684quoting \u7ae0\u8282)<\/p>\n<p>A1=B\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5e76\u975e\u4ee5\u6570\u5b57\u5f00\u5934<\/p>\n<p>A=$B$\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u53ef\u7528\u5728\u53d8\u91cf\u503c\u5185<\/p>\n<p>This_Is_A_Long_Name=b\u00a0\u00a0\u00a0\u00a0 \u53ef\u7528 _ \u8fde\u63a5\u8f83\u957f\u7684\u540d\u79f0\u6216\u503c\uff0c\u4e14\u5927\u5c0f\u5199\u6709\u522b\u3002<\/p>\n<p>Shell \u4e4b\u6240\u4ee5\u5f3a\u5927\uff0c\u5176\u4e2d\u7684\u4e00\u4e2a\u56e0\u7d20\u662f\u5b83\u53ef\u4ee5\u5728\u547d\u4ee4\u884c\u4e2d\u5bf9\u53d8\u91cf\u4f5c\u66ff\u6362(substitution)\u5904\u7406\u3002\u5728\u547d\u4ee4\u884c\u4e2d\u4f7f\u7528\u8005\u53ef\u4ee5\u4f7f\u7528 $ \u7b26\u53f7\u52a0\u4e0a\u53d8\u91cf\u540d\u79f0(\u9664\u4e86\u5728\u7528 = \u53f7\u5b9a\u4e49\u53d8\u91cf\u540d\u79f0\u4e4b\u5916)\uff0c\u5c06\u53d8\u91cf\u503c\u7ed9\u66ff\u6362\u51fa\u6765\uff0c\u7136\u540e\u518d\u91cd\u65b0\u7ec4\u5efa\u547d\u4ee4\u884c\u3002<\/p>\n<p>\u6bd4\u65b9\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=ls$ B=la<\/p>\n<p>$ C=\/tmp<\/p>\n<p>$ $A -$B $C<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(\u6ce8\u610f\uff1a\u4ee5\u4e0a\u547d\u4ee4\u884c\u7684\u7b2c\u4e00\u4e2a $ \u662f shell prompt \uff0c\u5e76\u4e0d\u5728\u547d\u4ee4\u884c\u4e4b\u5185)<\/p>\n<p>\u5fc5\u9700\u5f3a\u8c03\u7684\u662f\uff0c\u6211\u4eec\u6240\u63d0\u7684\u53d8\u91cf\u66ff\u6362\uff0c\u53ea\u53d1\u751f\u5728 command line \u4e0a\u9762\u3002(\u662f\u7684\uff0c\u8ba9\u6211\u4eec\u518d\u56de\u5230 command line \u5427\ufe57)\u4ed4\u7ec6\u5206\u6790\u6700\u540e\u90a3\u884c command line \uff0c\u4e0d\u96be\u53d1\u73b0\u5728\u88ab\u6267\u884c\u4e4b\u524d(\u5728\u8f93\u5165 CR \u5b57\u7b26\u4e4b\u524d)\uff0c$ \u7b26\u53f7\u4f1a\u5bf9\u6bcf\u4e00\u4e2a\u53d8\u91cf\u4f5c\u66ff\u6362\u5904\u7406(\u5c06\u53d8\u91cf\u503c\u66ff\u6362\u51fa\u6765\u518d\u91cd\u7ec4\u547d\u4ee4\u884c)\uff0c\u6700\u540e\u4f1a\u5f97\u51fa\u5982\u4e0b\u547d\u4ee4\u884c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">ls -la \/tmp<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd8\u8bb0\u5f97\u7b2c\u4e8c\u7ae0\u6211\u8bf7\u5927\u5bb6\u201c\u52a1\u5fc5\u7406\u89e3\u201d\u7684\u90a3\u4e24\u53e5\u5417\uff1f\u82e5\u4f60\u5fd8\u4e86\uff0c\u90a3\u6211\u8fd9\u91cc\u518d\u91cd\u8d34\u4e00\u904d\uff1a<\/p>\n<p>\u82e5\u4ece\u6280\u672f\u7ec6\u8282\u6765\u770b\uff0cshell \u4f1a\u4f9d\u636e IFS(Internal Field Seperator) \u5c06 command line \u6240\u8f93\u5165\u7684\u6587\u5b57\u7ed9\u62c6\u89e3\u4e3a\u201c\u5b57\u201d (word)\u3002\u7136\u540e\u518d\u9488\u5bf9\u7279\u6b8a\u5b57\u7b26(meta)\u5148\u4f5c\u5904\u7406\uff0c\u6700\u540e\u518d\u91cd\u7ec4\u6574\u884c command line \u3002<\/p>\n<p>\u8fd9\u91cc\u7684 $ \u5c31\u662f command line \u4e2d\u6700\u7ecf\u5178\u7684 meta \u4e4b\u4e00\u4e86\uff0c\u5c31\u662f\u4f5c\u53d8\u91cf\u66ff\u6362\u7684\ufe57\u5728\u65e5\u5e38\u7684 shell \u64cd\u4f5c\u4e2d\uff0c\u6211\u4eec\u5e38\u4f1a\u4f7f\u7528 echo \u547d\u4ee4\u6765\u67e5\u770b\u7279\u5b9a\u53d8\u91cf\u7684\u503c\uff0c\u4f8b\u5982\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo $A -$B $C<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6211\u4eec\u5df2\u5b66\u8fc7\uff0cecho \u547d\u4ee4\u53ea\u5355\u7eaf\u5c06\u5176 argument \u9001\u81f3\u201c\u6807\u51c6\u8f93\u51fa\u201d (STDOUT\uff0c\u901a\u5e38\u662f\u6211\u4eec\u7684\u5c4f\u5e55)\u3002 \u6240\u4ee5\u4e0a\u9762\u7684\u547d\u4ee4\u4f1a\u5728\u5c4f\u5e55\u4e0a\u5f97\u5230\u5982\u4e0b\u7ed3\u679c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">ls -la \/tmp<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u662f\u7531\u4e8e echo \u547d\u4ee4\u5728\u6267\u884c\u65f6\uff0c\u4f1a\u5148\u5c06 $A(ls)\u3001$B(la)\u3001\u8ddf $C(\/tmp) \u7ed9\u66ff\u6362\u51fa\u6765\u7684\u7ed3\u679c\u3002\u5229\u7528 shell \u5bf9\u53d8\u91cf\u7684\u66ff\u6362\u5904\u7406\u80fd\u529b\uff0c\u6211\u4eec\u5728\u8bbe\u5b9a\u53d8\u91cf\u65f6\u5c31\u66f4\u4e3a\u7075\u6d3b\u4e86\uff1a<\/p>\n<p>A=B<\/p>\n<p>B=$A<\/p>\n<p>\u8fd9\u6837\uff0cB \u7684\u53d8\u91cf\u503c\u5c31\u53ef\u7ee7\u627f A \u53d8\u91cf\u201c\u5f53\u65f6\u201d\u7684\u53d8\u91cf\u503c\u4e86\u3002\u4e0d\u8fc7\uff0c\u4e0d\u8981\u4ee5\u201c\u6570\u5b66\u903b\u8f91\u201d\u6765\u5957\u7528\u53d8\u91cf\u7684\u8bbe\u5b9a\uff0c\u6bd4\u65b9\u8bf4\uff1a<\/p>\n<p>A=B<\/p>\n<p>B=C<\/p>\n<p>\u8fd9\u6837\u5e76\u4e0d\u4f1a\u8ba9 A \u7684\u53d8\u91cf\u503c\u53d8\u6210 C \u3002\u518d\u5982\uff1a<\/p>\n<p>A=B<\/p>\n<p>B=$A<\/p>\n<p>A=C<\/p>\n<p>\u540c\u6837\u4e5f\u4e0d\u4f1a\u8ba9 B \u7684\u503c\u6362\u6210 C \u3002<\/p>\n<p>\u4e0a\u9762\u662f\u5355\u7eaf\u5b9a\u4e49\u4e86\u4e24\u4e2a\u4e0d\u540c\u540d\u79f0\u7684\u53d8\u91cf\uff1aA \u4e0e\u00a0\u00a0B \uff0c\u5b83\u4eec\u7684\u503c\u5206\u522b\u662f B \u4e0e\u00a0\u00a0C \u3002\u82e5\u53d8\u91cf\u88ab\u91cd\u590d\u5b9a\u4e49\u7684\u8bdd\uff0c\u5219\u539f\u6709\u65e7\u503c\u5c06\u88ab\u65b0\u503c\u6240\u53d6\u4ee3\u3002(\u8fd9\u4e0d\u6b63\u662f\u201c\u53ef\u53d8\u7684\u91cf\u201d\u5417)\u5f53\u6211\u4eec\u5728\u8bbe\u5b9a\u53d8\u91cf\u7684\u65f6\u4faf\uff0c\u8bf7\u8bb0\u7740\u8fd9\u70b9\uff1a<\/p>\n<p>* \u7528\u4e00\u4e2a\u540d\u79f0\u50a8\u5b58\u4e00\u4e2a\u6570\u503c<\/p>\n<p>\u4ec5\u6b64\u800c\u5df2\u3002<\/p>\n<p>\u6b64\u5916\uff0c\u6211\u4eec\u4e5f\u53ef\u5229\u7528\u547d\u4ee4\u884c\u7684\u53d8\u91cf\u66ff\u6362\u80fd\u529b\u6765\u201c\u6269\u5145\u201d (append)\u53d8\u91cf\u503c\uff1a<\/p>\n<p>A=B:C:D<\/p>\n<p>A=$A:E<\/p>\n<p>\u8fd9\u6837\uff0c\u7b2c\u4e00\u884c\u6211\u4eec\u8bbe\u5b9a A \u7684\u503c\u4e3a &#8220;B:C:D&#8221;\uff0c\u7136\u540e\uff0c\u7b2c\u4e8c\u884c\u518d\u5c06\u503c\u6269\u5145\u4e3a &#8220;B:C:D:E&#8221; \u3002\u4e0a\u9762\u7684\u6269\u5145\u8303\u4f8b\uff0c\u6211\u4eec\u4f7f\u7528\u533a\u9694\u7b26\u53f7( : )\u6765\u8fbe\u5230\u6269\u5145\u76ee\u7684\uff0c\u8981\u662f\u6ca1\u6709\u533a\u9694\u7b26\u53f7\u7684\u8bdd\uff0c\u5982\u4e0b\u662f\u6709\u95ee\u9898\u7684\uff1a<\/p>\n<p>A=BCD<\/p>\n<p>A=$AE<\/p>\n<p>\u56e0\u4e3a\u7b2c\u4e8c\u6b21\u662f\u5c06 A \u7684\u503c\u7ee7\u627f $AE \u7684\u63d0\u6362\u7ed3\u679c\uff0c\u800c\u975e $A \u518d\u52a0 E \ufe57\u8981\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u7528\u66f4\u4e25\u8c28\u7684\u66ff\u6362\u5904\u7406\uff1a<\/p>\n<p>A=BCD<\/p>\n<p>A=${A}E<\/p>\n<p>\u4e0a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528 {} \u5c06\u53d8\u91cf\u540d\u79f0\u7684\u8303\u56f4\u7ed9\u660e\u786e\u5b9a\u4e49\u51fa\u6765\uff0c\u5982\u6b64\u4e00\u6765\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5c06 A \u7684\u53d8\u91cf\u503c\u4ece BCD \u7ed9\u6269\u5145\u4e3a BCDE \u3002<\/p>\n<p>(\u63d0\u793a\uff1a\u5173\u4e8e ${name} \u4e8b\u5b9e\u4e0a\u8fd8\u53ef\u505a\u5230\u66f4\u591a\u7684\u53d8\u91cf\u5904\u7406\u80fd\u529b\uff0c\u8fd9\u4e9b\u5747\u5c5e\u4e8e\u6bd4\u8f83\u8fdb\u9636\u7684\u53d8\u91cf\u5904\u7406\uff0c\u73b0\u9636\u6bb5\u6682\u65f6\u4e0d\u4ecb\u7ecd\u4e86\uff0c\u8bf7\u5927\u5bb6\u81ea\u884c\u53c2\u8003\u6570\u636e\u3002\u5982 CU \u7684\u8d34\u5b50\uff1a <a href=\"http:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=201843\">http:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=201843<\/a>)<\/p>\n<p>\u4e25\u683c\u6765\u8bf4\uff0c\u6211\u4eec\u5728\u5f53\u524d shell \u4e2d\u6240\u5b9a\u4e49\u7684\u53d8\u91cf\uff0c\u5747\u5c5e\u4e8e\u201c\u672c\u5730\u53d8\u91cf\u201d (local variable)\uff0c\u53ea\u6709\u7ecf\u8fc7 export \u547d\u4ee4\u7684&#8221;\u8f93\u51fa&#8221;\u5904\u7406\uff0c\u624d\u80fd\u6210\u4e3a\u73af\u5883\u53d8\u91cf(environment variable)\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B$ export A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6216\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ export A=B<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7ecf\u8fc7 export \u8f93\u51fa\u5904\u7406\u4e4b\u540e\uff0c\u53d8\u91cf A \u5c31\u80fd\u6210\u4e3a\u4e00\u4e2a\u73af\u5883\u53d8\u91cf\u4f9b\u5176\u540e\u7684\u547d\u4ee4\u4f7f\u7528\u3002\u5728\u4f7f\u7528 export\u00a0\u00a0\u7684\u65f6\u4faf\uff0c\u8bf7\u522b\u5fd8\u8bb0 shell \u5728\u547d\u4ee4\u884c\u5bf9\u53d8\u91cf\u7684\u201c\u66ff\u6362\u201d (substitution)\u5904\u7406\uff0c\u6bd4\u65b9\u8bf4\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B$ B=C<\/p>\n<p>$ export $A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u9762\u7684\u547d\u4ee4\u5e76\u672a\u5c06 A \u8f93\u51fa\u4e3a\u73af\u5883\u53d8\u91cf\uff0c\u800c\u662f\u5c06 B \u4f5c\u8f93\u51fa\uff0c\u8fd9\u662f\u56e0\u4e3a\u5728\u8fd9\u4e2a\u547d\u4ee4\u884c\u4e2d\uff0c$A \u4f1a\u9996\u5148\u88ab\u63d0\u6362\u51fa B \u7136\u540e\u518d\u201c\u585e\u56de\u201d\u4f5c export \u7684\u53c2\u6570\u3002\u8981\u7406\u89e3\u8fd9\u4e2a export \uff0c\u4e8b\u5b9e\u4e0a\u9700\u8981\u4ece process \u7684\u89d2\u5ea6\u6765\u7406\u89e3\u624d\u80fd\u900f\u5f7b\u3002\u6211\u5c06\u4e8e\u4e0b\u4e00\u7ae0\u4e3a\u5927\u5bb6\u8bf4\u660e process \u7684\u89c2\u5ff5\uff0c\u656c\u8bf7\u7559\u610f\u3002<\/p>\n<p>\u8981\u53d6\u6d88\u4e00\u4e2a\u53d8\u91cf\uff0c\u5728 bash \u4e2d\u53ef\u4f7f\u7528 unset \u547d\u4ee4\u6765\u5904\u7406\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">unset A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0e export \u4e00\u6837\uff0cunset \u547d\u4ee4\u884c\u4e5f\u540c\u6837\u4f1a\u4f5c\u53d8\u91cf\u66ff\u6362(\u8fd9\u5176\u5b9e\u5c31\u662f shell \u7684\u529f\u80fd\u4e4b\u4e00)\uff0c\u56e0\u6b64\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=B$ B=C<\/p>\n<p>$ unset $A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e8b\u5b9e\u4e0a\u6240\u53d6\u6d88\u7684\u53d8\u91cf\u662f B \u800c\u4e0d\u662f A \u3002\u6b64\u5916\uff0c\u53d8\u91cf\u4e00\u65e6\u7ecf\u8fc7 unset \u53d6\u6d88\u4e4b\u540e\uff0c\u5176\u7ed3\u679c\u662f\u5c06\u6574\u4e2a\u53d8\u91cf\u62ff\u6389\uff0c\u800c\u4e0d\u4ec5\u662f\u53d6\u6d88\u5176\u53d8\u91cf\u503c\u3002\u5982\u4e0b\u4e24\u884c\u5176\u5b9e\u662f\u5f88\u4e0d\u4e00\u6837\u7684\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=$ unset A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7b2c\u4e00\u884c\u53ea\u662f\u5c06\u53d8\u91cf A \u8bbe\u5b9a\u4e3a\u201c\u7a7a\u503c\u201d (null\u00a0\u00a0value)\uff0c\u4f46\u7b2c\u4e8c\u884c\u5219\u8ba9\u53d8\u91cf A \u4e0d\u5728\u5b58\u5728\u3002\u867d\u7136\u7528\u773c\u775b\u6765\u770b\uff0c\u8fd9\u4e24\u79cd\u53d8\u91cf\u72b6\u6001\u5728\u5982\u4e0b\u547d\u4ee4\u7ed3\u679c\u4e2d\u90fd\u662f\u4e00\u6837\u7684\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=$ echo $A<\/p>\n<p>&nbsp;<\/p>\n<p>$ unset A<\/p>\n<p>$ echo $A<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8bf7\u5b66\u5458\u52a1\u5fc5\u80fd\u8bc6\u522b null value \u4e0e unset \u7684\u672c\u8d28\u533a\u522b\uff0c\u8fd9\u5728\u4e00\u4e9b\u8fdb\u9636\u7684\u53d8\u91cf\u5904\u7406\u4e0a\u662f\u5f88\u4e25\u683c\u7684\u3002\u6bd4\u65b9\u8bf4\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ str=\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 # \u8bbe\u4e3a null$ var=${str=expr}\u00a0 \u00a0 \u00a0 \u00a0 # \u5b9a\u4e49 var<\/p>\n<p>$ echo $var<\/p>\n<p>&nbsp;<\/p>\n<p>$ echo $str<\/p>\n<p>&nbsp;<\/p>\n<p>$ unset str\u00a0 \u00a0 \u00a0 \u00a0 # \u53d6\u6d88<\/p>\n<p>$ var=${str=expr}\u00a0 \u00a0 \u00a0 \u00a0 # \u5b9a\u4e49 var<\/p>\n<p>$ echo $var<\/p>\n<p>expr<\/p>\n<p>$ echo $str<\/p>\n<p>expr<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u806a\u660e\u7684\u8bfb\u8005(yes, you!)\uff0c\u7a0d\u52a0\u601d\u8003\u7684\u8bdd\uff0c\u5e94\u8be5\u4e0d\u96be\u53d1\u73b0\u4e3a\u4f55\u540c\u6837\u7684 var=${str=expr} \u5728 null \u4e0e unset \u4e4b\u4e0b\u7684\u4e0d\u540c\u5427\uff1f\u82e5\u4f60\u770b\u4e0d\u51fa\u6765\uff0c\u90a3\u53ef\u80fd\u662f\u5982\u4e0b\u539f\u56e0\u4e4b\u4e00\uff1a<\/p>\n<p>a. \u4f60\u592a\u7b28\u4e86<\/p>\n<p>b. \u4e0d\u4e86\u89e3\u00a0\u00a0var=${str=expr}\u00a0 \u00a0 \u00a0 \u00a0 \u8fd9\u4e2a\u8fdb\u9636\u5904\u7406<\/p>\n<p>c. \u5bf9\u672c\u7bc7\u8bf4\u660e\u8fd8\u6ca1\u6765\u5f97\u53ca\u6d88\u5316\u5438\u6536<\/p>\n<p>e. \u6211\u8bb2\u5f97\u4e0d\u597d<\/p>\n<p>\u4e0d\u77e5\uff0c\u4f60\u9009\u54ea\u4e2a\u5462\uff1f<\/p>\n<p>\u55ef\uff0c\u597d\u5427\uff0c\u6211\u5c31\u89e3\u91ca\u4e00\u4e0b var=${str=expr} \uff1a<\/p>\n<p>\u9996\u5148\uff0cvar=$str \u8fd9\u4e2a\u5927\u5bb6\u90fd\u53ef\u7406\u89e3\u5427\u3002\u800c\u63a5\u4e0b\u6765\u7684\u601d\u8003\u65b9\u5411\u662f\uff0c\u7a76\u7adf $str \u8fd9\u4e2a\u53d8\u91cf\u662f\u5982\u4e0b\u54ea\u4e00\u79cd\u60c5\u51b5\u5462\uff1a<\/p>\n<p>1) unset<\/p>\n<p>2) null<\/p>\n<p>3) not null<\/p>\n<p>1) \u5047\u5982\u662f unset \uff0c\u90a3\u4e48 var=${str=expr} \u7684\u7ed3\u679c\u5c06\u662f\uff1a<\/p>\n<p>var=expr<\/p>\n<p>str=expr<\/p>\n<p>2) \u5047\u5982\u662f null \uff0c\u90a3 var=${str=expr} \u7684\u7ed3\u679c\u662f\uff1a<\/p>\n<p>var=<\/p>\n<p>str=<\/p>\n<p>3) \u5047\u5982\u662f not null (\u6bd4\u65b9\u4e3a xyz )\uff0c\u90a3 var=${str=expr} \u4e4b\u7ed3\u679c\u662f\uff1a<\/p>\n<p>var=xyz<\/p>\n<p>str=xyz<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u518d\u6765\u770b\u770b var=${str:=expr} \u597d\u4e86\uff1a<\/p>\n<p>1) $str \u4e3a not set \uff1a<\/p>\n<p>var=expr<\/p>\n<p>str=expr<\/p>\n<p>2) $str \u4e3a null \uff1a<\/p>\n<p>var=expr<\/p>\n<p>str=expr<\/p>\n<p>3) $str \u4e3a not null (str=xyz)\uff1a<\/p>\n<p>var=xyz<\/p>\n<p>str=xyz<\/p>\n<p>\u6700\u540e\u6bd4\u6559\u4e00\u4e0b ${str=expr} \u4e0e ${str:=expr} \uff1a<\/p>\n<p>* \u4e24\u8005\u5728 not set \u4e0e not null \u90fd\u4e00\u81f3<\/p>\n<p>* \u4f46\u5f53 null \u503c\u65f6\uff0c\u524d\u8005\u4f1a\u5c06 $var \u4e0e $str \u90fd\u8bbe\u4e3a null \uff0c\u4f46\u540e\u8005\u5219\u8bbe\u4e3a expr<\/p>\n<p>\u4ece\u8fd9\u4e2a\u518d\u5ef6\u4f38\u51fa\u5176\u5b83\u6a21\u62df\uff0c\u4e0d\u9632\u8bf7\u5927\u5bb6\u201c\u5b9e\u4f5c\u201d\u89c2\u5bdf\u4e00\u4e0b\u6709\u4f55\u4e0d\u540c\uff1f<\/p>\n<p>var=${str-expr} VS var=${str:-expr}<\/p>\n<p>var=${str+expr} VS var=${str:+expr}<\/p>\n<p>var=${str?expr} VS var=${str:?expr}<\/p>\n<p>hey you: \u522b\u5077\u61d2\ufe57\u5feb\u505a\u505a\u770b&#8230; hurry up!<\/p>\n<p>&nbsp;<\/p>\n<h1>6 exec \u8ddf source \u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u8fd9\u6b21\u5148\u8ba9\u6211\u4eec\u4ece CU Shell \u7248\u7684\u4e00\u4e2a\u5b9e\u4f8b\u8d34\u5b50\u6765\u8c08\u8d77\u5427\uff1a( http:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=194191 )\u4f8b\u4e2d\u7684\u63d0\u95ee\u662f\uff1a<\/p>\n<p>cd \/etc\/aa\/bb\/cc\u53ef\u4ee5\u6267\u884c\uff0c\u4f46\u662f\u628a\u8fd9\u6761\u547d\u4ee4\u5199\u5165shell\u65f6shell\u4e0d\u6267\u884c\uff01\u8fd9\u662f\u4ec0\u4e48\u539f\u56e0\u5440\uff1f<\/p>\n<p>\u6211\u5f53\u65f6\u5982\u4f55\u56de\u7b54\u6682\u65f6\u522b\u53bb\u6df1\u7a76\uff0c\u5148\u8ba9\u6211\u4eec\u4e86\u89e3\u4e00\u4e0b\u8fdb\u7a0b(process)\u7684\u89c2\u5ff5\u597d\u4e86\u3002\u9996\u5148\uff0c\u6211\u4eec\u6240\u6267\u884c\u7684\u4efb\u4f55\u7a0b\u5e8f\uff0c\u90fd\u662f\u7531\u7236\u8fdb\u7a0b(parent process)\u6240\u4ea7\u751f\u51fa\u6765\u7684\u4e00\u4e2a\u5b50\u8fdb\u7a0b(child process)\uff0c\u5b50\u8fdb\u7a0b\u5728\u7ed3\u675f\u540e\uff0c\u5c06\u8fd4\u56de\u5230\u7236\u8fdb\u7a0b\u53bb\u3002\u6b64\u4e00\u73b0\u50cf\u5728 Linux \u7cfb\u7edf\u4e2d\u88ab\u79f0\u4e3a\u00a0\u00a0fork \u3002 (\u4e3a\u4f55\u8981\u79f0\u4e3a\u4e3a fork \u5462\uff1f\u55ef\uff0c\u753b\u4e00\u4e0b\u56fe\u6216\u8bb8\u6bd4\u8f83\u597d\u7406\u89e3)\u5f53\u5b50\u8fdb\u7a0b\u88ab\u4ea7\u751f\u7684\u65f6\u5019\uff0c\u5c06\u4f1a\u4ece\u7236\u8fdb\u7a0b\u90a3\u91cc\u83b7\u5f97\u4e00\u5b9a\u7684\u8d44\u6e90\u5206\u914d\u3001\u53ca(\u66f4\u91cd\u8981\u7684\u662f)\u7ee7\u627f\u7236\u8fdb\u7a0b\u7684\u73af\u5883\ufe57\u8ba9\u6211\u4eec\u56de\u5230\u4e0a\u4e00\u7ae0\u6240\u8c08\u5230\u7684\u201c\u73af\u5883\u53d8\u91cf\u201d\u5427\uff1a<\/p>\n<p>* \u6240\u8c13\u73af\u5883\u53d8\u91cf\u5176\u5b9e\u5c31\u662f\u90a3\u4e9b\u4f1a\u4f20\u7ed9\u5b50\u8fdb\u7a0b\u7684\u53d8\u91cf\u3002<\/p>\n<p>\u7b80\u5355\u800c\u8a00\uff0c\u201c\u9057\u4f20\u6027\u201d\u5c31\u662f\u533a\u5206\u672c\u5730\u53d8\u91cf\u4e0e\u73af\u5883\u53d8\u91cf\u7684\u51b3\u5b9a\u6027\u6307\u6807\u3002\u7136\u800c\uff0c\u4ece\u9057\u4f20\u7684\u89d2\u5ea6\u6765\u770b\uff0c\u6211\u4eec\u4e5f\u4e0d\u96be\u53d1\u73b0\u73af\u5883\u53d8\u91cf\u7684\u53e6\u4e00\u4e2a\u91cd\u8981\u7279\u5f81\uff1a<\/p>\n<p>* \u73af\u5883\u53d8\u91cf\u53ea\u80fd\u4ece\u7236\u8fdb\u7a0b\u5230\u5b50\u8fdb\u7a0b\u5355\u5411\u7ee7\u627f\u3002\u6362\u53e5\u8bdd\u8bf4\uff1a\u5728\u5b50\u8fdb\u7a0b\u4e2d\u7684\u73af\u5883\u5982\u4f55\u53d8\u66f4\uff0c\u5747\u4e0d\u4f1a\u5f71\u54cd\u7236\u8fdb\u7a0b\u7684\u73af\u5883\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u518d\u8ba9\u6211\u4eec\u4e86\u89e3\u4e00\u4e0b\u547d\u4ee4\u811a\u672c(shell script)\u7684\u6982\u5ff5\u3002\u6240\u8c13\u7684 shell script \u8bb2\u8d77\u6765\u5f88\u7b80\u5355\uff0c\u5c31\u662f\u5c06\u4f60\u5e73\u65f6\u5728 shell prompt \u540e\u6240\u8f93\u5165\u7684\u591a\u884c command line \u4f9d\u5e8f\u5199\u5165\u4e00\u4e2a\u6587\u4ef6\u53bb\u800c\u5df2\u3002\u5176\u4e2d\u518d\u52a0\u4e0a\u4e00\u4e9b\u6761\u4ef6\u5224\u65ad\u3001\u4e92\u52a8\u754c\u9762\u3001\u53c2\u6570\u8fd0\u7528\u3001\u51fd\u6570\u8c03\u7528\u3001\u7b49\u7b49\u6280\u5de7\uff0c\u5f97\u4ee5\u8ba9 script \u66f4\u52a0\u201c\u806a\u660e\u201d\u7684\u6267\u884c\uff0c\u4f46\u82e5\u6487\u5f00\u8fd9\u4e9b\u6280\u5de7\u4e0d\u8c08\uff0c\u6211\u4eec\u771f\u7684\u53ef\u4ee5\u7b80\u5355\u7684\u770b\u6210 script \u53ea\u4e0d\u8fc7\u4f9d\u6b21\u6267\u884c\u9884\u5148\u5199\u597d\u7684\u547d\u4ee4\u884c\u800c\u5df2\u3002\u518d\u7ed3\u5408\u4ee5\u4e0a\u4e24\u4e2a\u6982\u5ff5(process + script)\uff0c\u90a3\u5e94\u8be5\u5c31\u4e0d\u96be\u7406\u89e3\u5982\u4e0b\u8fd9\u53e5\u8bdd\u7684\u610f\u601d\u4e86\uff1a<\/p>\n<p>* \u6b63\u5e38\u6765\u8bf4\uff0c\u5f53\u6211\u4eec\u6267\u884c\u4e00\u4e2a shell script \u65f6\uff0c\u5176\u5b9e\u662f\u5148\u4ea7\u751f\u4e00\u4e2a sub-shell \u7684\u5b50\u8fdb\u7a0b\uff0c\u7136\u540e sub-shell \u518d\u53bb\u4ea7\u751f\u547d\u4ee4\u884c\u7684\u5b50\u8fdb\u7a0b\u3002<\/p>\n<p>\u7136\u5219\uff0c\u90a3\u8ba9\u6211\u4eec\u56de\u5230\u672c\u7ae0\u5f00\u59cb\u65f6\u6240\u63d0\u5230\u7684\u4f8b\u5b50\u518d\u4ece\u65b0\u601d\u8003\uff1a<\/p>\n<p>\u6211\u5f53\u65f6\u7684\u7b54\u6848\u662f\u8fd9\u6837\u7684\uff1a<\/p>\n<p>\u56e0\u4e3a\uff0c\u4e00\u822c\u6211\u4eec\u8dd1\u7684 shell script \u662f\u7528 subshell \u53bb\u6267\u884c\u7684\u3002\u4ece process \u7684\u89c2\u5ff5\u6765\u770b\uff0c\u662f parent process \u4ea7\u751f\u4e00\u4e2a child process \u53bb\u6267\u884c\uff0c\u5f53 child \u7ed3\u675f\u540e\uff0c\u4f1a\u8fd4\u56de parent \uff0c\u4f46 parent \u7684\u73af\u5883\u662f\u4e0d\u4f1a\u56e0 child \u7684\u6539\u53d8\u800c\u6539\u53d8\u7684\u3002\u6240\u8c13\u7684\u73af\u5883\u53d8\u91cf\u5f88\u591a\uff0c\u4f8b\u5982effective id, variable, workding dir \u7b49\u7b49\uff0c\u5176\u4e2d\u7684 workding dir ($PWD) \u6b63\u662f\u697c\u4e3b\u7684\u7591\u95ee\u6240\u5728\uff1a\u5f53\u7528 subshell \u6765\u8dd1 script \u7684\u8bdd\uff0csub shell \u7684 $PWD \u4f1a\u56e0\u4e3a cd \u800c\u53d8\u66f4\uff0c \u4f46\u5f53\u8fd4\u56de primary shell \u65f6\uff0c$PWD \u662f\u4e0d\u4f1a\u53d8\u66f4\u7684\u3002<\/p>\n<p>\u80fd\u591f\u4e86\u89e3\u95ee\u9898\u7684\u539f\u56e0\u53ca\u5176\u539f\u7406\u662f\u5f88\u597d\u7684\uff0c\u4f46\u662f\uff1f\u5982\u4f55\u89e3\u51b3\u95ee\u9898\u6050\u6015\u662f\u6211\u4eec\u66f4\u611f\u5174\u8da3\u7684\ufe57\u662f\u5427\uff1f\u90a3\u597d\uff0c\u63a5\u4e0b\u6765\uff0c\u518d\u8ba9\u6211\u4eec\u4e86\u89e3\u4e00\u4e0b source \u547d\u4ee4\u597d\u4e86\u3002\u5f53\u4f60\u6709\u4e86 fork \u7684\u6982\u5ff5\u4e4b\u540e\uff0c\u8981\u7406\u89e3 source \u5c31\u4e0d\u96be\uff1a<\/p>\n<p>* \u6240\u8c13 source \u5c31\u662f\u8ba9 script \u5728\u5f53\u524d shell \u5185\u6267\u884c\u3001\u800c\u4e0d\u662f\u4ea7\u751f\u4e00\u4e2a sub-shell \u6765\u6267\u884c\u3002<\/p>\n<p>\u7531\u4e8e\u6240\u6709\u6267\u884c\u7ed3\u679c\u5747\u4e8e\u5f53\u524d shell \u5185\u5b8c\u6210\uff0c\u82e5 script \u7684\u73af\u5883\u6709\u6240\u6539\u53d8\uff0c\u5f53\u7136\u4e5f\u4f1a\u6539\u53d8\u5f53\u524d\u73af\u5883\u4e86\ufe57\u56e0\u6b64\uff0c\u53ea\u8981\u6211\u4eec\u8981\u5c06\u539f\u672c\u5355\u72ec\u8f93\u5165\u7684 script \u547d\u4ee4\u884c\u53d8\u6210 source \u547d\u4ee4\u7684\u53c2\u6570\uff0c\u5c31\u53ef\u8f7b\u6613\u89e3\u51b3\u524d\u4f8b\u63d0\u5230\u7684\u95ee\u9898\u4e86\u3002\u6bd4\u65b9\u8bf4\uff0c\u539f\u672c\u6211\u4eec\u662f\u5982\u6b64\u6267\u884c\u00a0\u00a0script \u7684\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">.\/my.script<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u73b0\u5728\u6539\u6210\u8fd9\u6837\u5373\u53ef\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">source .\/my.script<br \/>\n\u6216\uff1a. .\/my.script<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8bf4\u5230\u8fd9\u91cc\uff0c\u6211\u60f3\uff0c\u5404\u4f4d\u6709\u5174\u8da3\u770b\u770b \/etc \u5e95\u4e0b\u7684\u4f17\u591a\u8bbe\u5b9a\u6587\u4ef6\uff0c\u5e94\u8be5\u4e0d\u96be\u7406\u89e3\u5b83\u4eec\u88ab\u5b9a\u4e49\u540e\uff0c\u5982\u4f55\u8ba9\u5176\u5b83 script \u8bfb\u53d6\u5e76\u7ee7\u627f\u4e86\u5427\uff1f\u82e5\u7136\uff0c\u65e5\u540e\u4f60\u6709\u673a\u4f1a\u5199\u81ea\u5df1\u7684 script \uff0c\u5e94\u4e5f\u4e0d\u96be\u4e13\u95e8\u6307\u5b9a\u4e00\u4e2a\u8bbe\u5b9a\u6587\u4ef6\u4ee5\u4f9b\u4e0d\u540c\u7684 script \u4e00\u8d77\u201c\u5171\u4eab\u201d\u4e86\u3002okay\uff0c\u5230\u8fd9\u91cc\uff0c\u82e5\u4f60\u641e\u5f97\u61c2 fork \u4e0e source \u7684\u4e0d\u540c\uff0c\u90a3\u63a5\u4e0b\u6765\u518d\u63a5\u53d7\u4e00\u4e2a\u6311\u6218\uff1a\u90a3 exec \u53c8\u4e0e source\/fork \u6709\u4f55\u4e0d\u540c\u5462\uff1f<\/p>\n<p>\u54e6\uff0c\u8981\u4e86\u89e3 exec \u6216\u8bb8\u8f83\u4e3a\u590d\u6742\uff0c\u5c24\u5176\u626f\u4e0a File Descriptor \u7684\u8bdd\u3002\u4e0d\u8fc7\uff0c\u7b80\u5355\u6765\u8bf4\uff1a<\/p>\n<p>* exec \u4e5f\u662f\u8ba9 script \u5728\u540c\u4e00\u4e2a\u8fdb\u7a0b\u4e0a\u6267\u884c\uff0c\u4f46\u662f\u539f\u6709\u8fdb\u7a0b\u5219\u88ab\u7ed3\u675f\u4e86\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u7b80\u800c\u8a00\u4e4b\uff1a\u539f\u6709\u8fdb\u7a0b\u4f1a\u5426\u7ec8\u6b62\uff0c\u5c31\u662f exec \u4e0e source\/fork \u7684\u6700\u5927\u5dee\u5f02\u4e86\u3002<\/p>\n<p>\u55ef\uff0c\u5149\u662f\u4ece\u7406\u8bba\u53bb\u7406\u89e3\uff0c\u6216\u8bb8\u6ca1\u90a3\u4e48\u597d\u6d88\u5316\uff0c\u4e0d\u5982\u52a8\u624b\u201c\u5b9e\u4f5c+\u601d\u8003\u201d\u6765\u7684\u5370\u50cf\u6df1\u523b\u54e6\u3002\u4e0b\u9762\u8ba9\u6211\u4eec\u5199\u4e24\u4e2a\u7b80\u5355\u7684 script \uff0c\u5206\u522b\u547d\u4ee4\u4e3a 1.sh \u53ca 2.sh \uff1a<br \/>\n1.sh<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">#!\/bin\/bashA=B<\/p>\n<p>echo &#8220;PID for 1.sh before exec\/source\/fork:$$&#8221;<\/p>\n<p>export A<\/p>\n<p>echo &#8220;1.sh: $A is $A&#8221;<\/p>\n<p>case $1 in<\/p>\n<p>exec)<\/p>\n<p>echo &#8220;using exec&#8230;&#8221;<\/p>\n<p>exec .\/2.sh ;;<\/p>\n<p>source)<\/p>\n<p>echo &#8220;using source&#8230;&#8221;<\/p>\n<p>. .\/2.sh ;;<\/p>\n<p>*)<\/p>\n<p>echo &#8220;using fork by default&#8230;&#8221;<\/p>\n<p>.\/2.sh ;;<\/p>\n<p>Esac<\/p>\n<p>echo &#8220;PID for 1.sh after exec\/source\/fork:$$&#8221;<\/p>\n<p>echo &#8220;1.sh: $A is $A&#8221;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>2.sh<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">#!\/bin\/bashecho &#8220;PID for 2.sh: $$&#8221;<\/p>\n<p>echo &#8220;2.sh get $A=$A from 1.sh&#8221;<\/p>\n<p>A=C<\/p>\n<p>export A<\/p>\n<p>echo &#8220;2.sh: $A is $A&#8221;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7136\u540e\uff0c\u5206\u522b\u8dd1\u5982\u4e0b\u53c2\u6570\u6765\u89c2\u5bdf\u7ed3\u679c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ .\/1.sh fork$ .\/1.sh source<\/p>\n<p>$ .\/1.sh exec<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6216\u662f\uff0c\u4f60\u4e5f\u53ef\u4ee5\u53c2\u8003 CU \u4e0a\u7684\u53e6\u4e00\u8d34\u5b50\uff1a <a href=\"http:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=191051\">http:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=191051<\/a><\/p>\n<p>\u597d\u4e86\uff0c\u522b\u5fd8\u4e86\u4ed4\u7ec6\u6bd4\u8f83\u8f93\u51fa\u7ed3\u679c\u7684\u4e0d\u540c\u53ca\u80cc\u540e\u7684\u539f\u56e0\u54e6\u3002\u82e5\u6709\u7591\u95ee\uff0c\u6b22\u8fce\u63d0\u51fa\u6765\u4e00\u8d77\u8ba8\u8bba\u8ba8\u8bba<\/p>\n<p>happy scripting!<\/p>\n<h1>7 ( ) \u4e0e { } \u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u55ef\uff0c\u8fd9\u6b21\u8f7b\u677e\u4e00\u4e0b\uff0c\u4e0d\u8bb2\u592a\u591a\u3002\u5148\u8bf4\u4e00\u4e0b\uff0c\u4e3a\u4f55\u8981\u7528 ( ) \u6216 { } \u597d\u4e86\u3002\u8bb8\u591a\u65f6\u5019\uff0c\u6211\u4eec\u5728 shell \u64cd\u4f5c\u4e0a\uff0c\u9700\u8981\u5728\u4e00\u5b9a\u6761\u4ef6\u4e0b\u4e00\u6b21\u6267\u884c\u591a\u4e2a\u547d\u4ee4\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u8981\u4e48\u4e0d\u6267\u884c\uff0c\u8981\u4e48\u5c31\u5168\u6267\u884c\uff0c\u800c\u4e0d\u662f\u6bcf\u6b21\u4f9d\u5e8f\u7684\u5224\u65ad\u662f\u5426\u8981\u6267\u884c\u4e0b\u4e00\u4e2a\u547d\u4ee4\u3002\u6216\u662f\uff0c\u9700\u8981\u4ece\u4e00\u4e9b\u547d\u4ee4\u6267\u884c\u4f18\u5148\u6b21\u987a\u4e2d\u5f97\u5230\u8c41\u514d\uff0c\u5982\u7b97\u672f\u7684 2*(3+4) \u90a3\u6837\uff0c\uff0c\u6211\u4eec\u5c31\u53ef\u5f15\u5165\u201c\u547d\u4ee4\u7ec4\u201d (command group)\u7684\u6982\u5ff5\uff1a\u5c06\u591a\u4e2a\u547d\u4ee4\u96c6\u4e2d\u5904\u7406\u3002<\/p>\n<p>\u5728 shell command line \u4e2d\uff0c\u4e00\u822c\u4eba\u6216\u8bb8\u4e0d\u592a\u8ba1\u8f83 ( ) \u4e0e { } \u8fd9\u4e24\u5bf9\u7b26\u53f7\u7684\u5dee\u5f02\uff0c\u867d\u7136\u4e24\u8005\u90fd\u53ef\u5c06\u591a\u4e2a\u547d\u4ee4\u4f5c\u7fa4\u7ec4\u5316\u5904\u7406\uff0c\u4f46\u82e5\u4ece\u6280\u672f\u7ec6\u8282\u4e0a\uff0c\u5374\u662f\u5f88\u4e0d\u4e00\u6837\u7684\uff1a<\/p>\n<p>( ) \u5c06 command group \u7f6e\u4e8e sub-shell \u53bb\u6267\u884c\uff0c\u4e5f\u79f0 nested sub-shell\u3002<\/p>\n<p>{ } \u5219\u662f\u5728\u540c\u4e00\u4e2a shell \u5185\u5b8c\u6210\uff0c\u4e5f\u79f0\u4e3a non-named command group\u3002<\/p>\n<p>\u82e5\u4f60\u5bf9\u4e0a\u4e00\u7ae0\u7684 fork \u4e0e source \u7684\u6982\u5ff5\u8fd8\u8bb0\u5f97\u7684\u8bdd\uff0c\u90a3\u5c31\u4e0d\u96be\u7406\u89e3\u4e24\u8005\u7684\u5dee\u5f02\u4e86\u3002\u8981\u662f\u5728 command group \u4e2d\u626f\u4e0a\u53d8\u91cf\u53ca\u5176\u5b83\u73af\u5883\u7684\u4fee\u6539\uff0c\u6211\u4eec\u53ef\u4ee5\u6839\u636e\u4e0d\u540c\u7684\u9700\u6c42\u6765\u4f7f\u7528 ( ) \u6216 { } \u3002\u901a\u5e38\u800c\u8a00\uff0c\u82e5\u6240\u4f5c\u7684\u4fee\u6539\u662f\u4e34\u65f6\u7684\uff0c\u4e14\u4e0d\u60f3\u5f71\u54cd\u539f\u6709\u6216\u4ee5\u540e\u7684\u8bbe\u5b9a\uff0c\u90a3\u6211\u4eec\u5c31 nested sub-shell \uff0c\u53cd\u4e4b\uff0c\u5219\u7528 non-named command group \u3002<\/p>\n<p>\u662f\u7684\uff0c\u5149\u4ece command line \u6765\u770b\uff0c( ) \u4e0e { } \u7684\u5dee\u522b\u5c31\u8bb2\u5b8c\u4e86\uff0c\u591f\u8f7b\u677e\u5427\u3002\u7136\u800c\uff0c\u82e5\u8fd9\u4e24\u4e2a meta \u7528\u5728\u5176\u5b83 command meta \u6216\u9886\u57df\u4e2d(\u5982 Regular Expression)\uff0c\u8fd8\u662f\u6709\u5f88\u591a\u5dee\u522b\u7684\u3002\u53ea\u662f\uff0c\u6211\u4e0d\u6253\u7b97\u518d\u53bb\u8bf4\u660e\u4e86\uff0c\u7559\u7ed9\u8bfb\u8005\u81ea\u5df1\u6162\u6162\u53d1\u6398\u597d\u4e86\u3002\u6211\u8fd9\u91cc\u53ea\u60f3\u8865\u5145\u4e00\u4e2a\u6982\u5ff5\uff0c\u5c31\u662f function \u3002<\/p>\n<p>\u6240\u8c13\u7684<strong> function <\/strong>\uff0c\u5c31\u662f\u7528\u4e00\u4e2a\u540d\u5b57\u53bb\u547d\u540d\u4e00\u4e2a\u00a0\u00a0command group \uff0c\u7136\u540e\u518d\u8c03\u7528\u8fd9\u4e2a\u540d\u5b57\u53bb\u6267\u884c command group \u3002<\/p>\n<p>\u4ece non-named command group \u6765\u63a8\u65ad\uff0c\u5927\u6982\u4f60\u4e5f\u53ef\u4ee5\u731c\u5230\u6211\u8981\u8bf4\u7684\u662f <strong>{ }<\/strong>\u4e86\u5427\uff1f(yes! \u4f60\u771f\u806a\u660e\ufe57\u00a0\u00a0)\u5728 bash \u4e2d\uff0cfunction \u7684\u5b9a\u4e49\u65b9\u5f0f\u6709\u4e24\u79cd\uff1a<\/p>\n<p>\u65b9\u5f0f\u4e00\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">function function_name {command1<\/p>\n<p>command2<\/p>\n<p>command3<\/p>\n<p>&#8230;.<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u65b9\u5f0f\u4e8c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">function_name {command1<\/p>\n<p>command2<\/p>\n<p>command3<\/p>\n<p>&#8230;.<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7528\u54ea\u4e00\u79cd\u65b9\u5f0f\u65e0\u6240\u8c13\uff0c\u53ea\u662f\u82e5\u78b0\u5230\u6240\u5b9a\u610f\u7684\u540d\u79f0\u4e0e\u73b0\u6709\u7684\u547d\u4ee4\u6216\u522b\u540d(Alias)\u51b2\u7a81\u7684\u8bdd\uff0c\u65b9\u5f0f\u4e8c\u6216\u8bb8\u4f1a\u5931\u8d25\u3002\u4f46\u65b9\u5f0f\u4e8c\u8d77\u7801\u53ef\u4ee5\u5c11\u6253 function \u8fd9\u4e00\u4e32\u82f1\u6587\u5b57\u6bcd\uff0c\u5bf9\u61d2\u4eba\u6765\u8bf4(\u5982\u6211)\uff0c\u53c8\u4f55\u4e50\u4e0d\u4e3a\u5462\u3002<\/p>\n<p>function \u5728\u67d0\u4e00\u7a0b\u5ea6\u6765\u8bf4\uff0c\u4e5f\u53ef\u79f0\u4e3a\u201c\u51fd\u6570\u201d\uff0c\u4f46\u8bf7\u4e0d\u8981\u4e0e\u4f20\u7edf\u7f16\u7a0b\u6240\u4f7f\u7528\u7684\u51fd\u6570\u5e93(library)\u641e\u6df7\u4e86\uff0c\u6bd5\u7adf\u4e24\u8005\u5dee\u5f02\u5f88\u5927\u3002\u60df\u4e00\u76f8\u540c\u7684\u662f\uff0c\u6211\u4eec\u90fd\u53ef\u4ee5\u968f\u65f6\u7528\u201c\u5df2\u5b9a\u4e49\u7684\u540d\u79f0\u201d\u6765\u8c03\u7528\u5b83\u4eec\u3002\u82e5\u6211\u4eec\u5728 shell \u64cd\u4f5c\u4e2d\uff0c\u9700\u8981\u4e0d\u65ad\u7684\u91cd\u590d\u51e0\u884c\u67d0\u4e9b\u547d\u4ee4\uff0c\u6211\u4eec\u9996\u5148\u60f3\u5230\u7684\uff0c\u6216\u8bb8\u662f\u5c06\u547d\u4ee4\u5199\u6210\u547d\u4ee4\u811a\u672c(shell script)\u3002\u4e0d\u8fc7\uff0c\u6211\u4eec\u4e5f\u53ef\u4ee5\u5199\u6210 function \uff0c\u7136\u540e\u5728 command line \u4e2d\u6253\u4e0a function_name \u5c31\u53ef\u5f53\u4e00\u8228\u7684 script \u6765\u4f7f\u7528\u4e86\u3002\u53ea\u662f\u82e5\u4f60\u5728 shell \u4e2d\u5b9a\u4e49\u7684 function \uff0c\u9664\u4e86\u53ef\u7528 unset function_name \u53d6\u6d88\u5916\uff0c\u4e00\u65e6\u9000\u51fa shell \uff0cfunction \u4e5f\u8ddf\u7740\u53d6\u6d88\u3002\u7136\u800c\uff0c\u5728 script \u4e2d\u4f7f\u7528 function \u5374\u6709\u8bb8\u591a\u597d\u5904\uff0c\u9664\u4e86\u53ef\u4ee5\u63d0\u9ad8\u6574\u4f53 script \u7684\u6267\u884c\u6548\u80fd\u5916(\u56e0\u4e3a\u5df2\u88ab\u52a0\u8f7d)\uff0c\u8fd8\u53ef\u4ee5\u8282\u7701\u8bb8\u591a\u91cd\u590d\u7684\u4ee3\u7801\u3002\u7b80\u5355\u800c\u8a00\uff0c\u82e5\u4f60\u4f1a\u5c06\u591a\u4e2a\u547d\u4ee4\u5199\u6210 script \u4ee5\u4f9b\u8c03\u7528\u7684\u8bdd\uff0c\u90a3\u4f60\u53ef\u4ee5\u5c06 function \u770b\u6210\u662f <strong>script <\/strong><strong>\u4e2d\u7684<\/strong><strong> script<\/strong>\uff0c\u800c\u4e14\uff0c\u900f\u8fc7\u4e0a\u4e00\u7ae0\u4ecb\u7ecd\u7684 source \u547d\u4ee4\uff0c\u6211\u4eec\u53ef\u4ee5\u81ea\u884c\u5b9a\u4e49\u8bb8\u8bb8\u591a\u591a\u597d\u7528\u7684 function \uff0c\u518d\u96c6\u4e2d\u5199\u5728\u7279\u5b9a\u6587\u4ef6\u4e2d\uff0c\u7136\u540e\uff0c\u5728\u5176\u5b83\u7684 script \u4e2d\u7528 source \u5c06\u5b83\u4eec\u52a0\u8f7d\u5e76\u53cd\u590d\u6267\u884c\u3002\u82e5\u4f60\u662f RedHat Linux \u7684\u4f7f\u7528\u8005\uff0c\u6216\u8bb8\uff0c\u5df2\u7ecf\u731c\u5f97\u51fa \/etc\/rc.d\/init.d\/functions \u8fd9\u4e2a\u6587\u4ef6\u662f\u4f5c\u5565\u7528\u7684\u4e86\u3002<\/p>\n<h1>8 $(( )) \u4e0e $( ) \u8fd8\u6709${ } \u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u6211\u4eec\u4e0a\u4e00\u7ae0\u4ecb\u7ecd\u4e86 ( ) \u4e0e { } \u7684\u4e0d\u540c\uff0c\u8fd9\u6b21\u8ba9\u6211\u4eec\u6269\u5c55\u4e00\u4e0b\uff0c\u770b\u770b\u66f4\u591a\u7684\u53d8\u5316\uff1a$( ) \u4e0e ${ } \u53c8\u662f\u5565\u73a9\u610f\u513f\u5462\uff1f\u5728 bash shell \u4e2d\uff0c$( ) \u4e0e ` ` (\u53cd\u5f15\u53f7) \u90fd\u662f\u7528\u6765\u505a\u547d\u4ee4\u66ff\u6362\u7528(command substitution)\u7684\u3002\u6240\u8c13\u7684\u547d\u4ee4\u66ff\u6362\u4e0e\u6211\u4eec\u7b2c\u4e94\u7ae0\u5b66\u8fc7\u7684\u53d8\u91cf\u66ff\u6362\u5dee\u4e0d\u591a\uff0c\u90fd\u662f\u7528\u6765\u91cd\u7ec4\u547d\u4ee4\u884c\uff1a<\/p>\n<p>* \u5b8c\u6210\u5f15\u53f7\u91cc\u7684\u547d\u4ee4\u884c\uff0c\u7136\u540e\u5c06\u5176\u7ed3\u679c\u66ff\u6362\u51fa\u6765\uff0c\u518d\u91cd\u7ec4\u547d\u4ee4\u884c\u3002<\/p>\n<p>\u4f8b\u5982\uff1a<\/p>\n<p>$ echo the last sunday is $(date -d &#8220;last sunday&#8221; +%Y-%m-%d)<\/p>\n<p>\u5982\u6b64\u4fbf\u53ef\u65b9\u4fbf\u5f97\u5230\u4e0a\u4e00\u661f\u671f\u5929\u7684\u65e5\u671f\u4e86\u3002<\/p>\n<p>\u5728\u64cd\u4f5c\u4e0a\uff0c\u7528 $( ) \u6216 ` ` \u90fd\u65e0\u6240\u8c13\uff0c\u53ea\u662f\u6211\u4e2a\u4eba\u6bd4\u8f83\u559c\u6b22\u7528 $( ) \uff0c\u7406\u7531\u662f\uff1a<\/p>\n<p>1\uff09\u00a0` ` \u5f88\u5bb9\u6613\u4e0e &#8216; &#8216; ( \u5355\u5f15\u53f7)\u641e\u6df7\u4e71\uff0c\u5c24\u5176\u5bf9\u521d\u5b66\u8005\u6765\u8bf4\u3002<\/p>\n<p>\u6709\u65f6\u5728\u4e00\u4e9b\u5947\u602a\u7684\u5b57\u5f62\u663e\u793a\u4e2d\uff0c\u4e24\u79cd\u7b26\u53f7\u662f\u4e00\u6a21\u4e00\u6837\u7684(\u76f4\u7ad6\u4e24\u70b9)\u3002\u5f53\u7136\u4e86\uff0c\u6709\u7ecf\u9a8c\u7684\u670b\u53cb\u8fd8\u662f\u4e00\u773c\u5c31\u80fd\u5206\u8fa9\u4e24\u8005\u3002\u53ea\u662f\uff0c\u82e5\u80fd\u66f4\u597d\u7684\u907f\u514d\u6df7\u4e71\uff0c\u53c8\u4f55\u4e50\u4e0d\u4e3a\u5462\uff1f<\/p>\n<p>2\uff09\u5728\u591a\u5c42\u6b21\u7684\u590d\u5408\u66ff\u6362\u4e2d\uff0c` ` \u987b\u8981\u989d\u5916\u7684\u8df3\u8131( ` )\u5904\u7406\uff0c\u800c $( ) \u5219\u6bd4\u8f83\u76f4\u89c2\u3002<\/p>\n<p>\u4f8b\u5982\uff1a<\/p>\n<p>\u8fd9\u662f\u9519\u7684\uff1a<\/p>\n<p>command1 `command2 `command3` `<\/p>\n<p>\u539f\u672c\u7684\u610f\u56fe\u662f\u8981\u5728 command2 `command3` \u5148\u5c06 command3 \u63d0\u6362\u51fa\u6765\u7ed9 command 2 \u5904\u7406\uff0c\u7136\u540e\u518d\u5c06\u7ed3\u679c\u4f20\u7ed9 command1 `command2 &#8230;` \u6765\u5904\u7406\u3002\u7136\u800c\uff0c\u771f\u6b63\u7684\u7ed3\u679c\u5728\u547d\u4ee4\u884c\u4e2d\u5374\u662f\u5206\u6210\u4e86 `command2 ` \u4e0e &#8220; \u4e24\u6bb5\u3002<\/p>\n<p>\u6b63\u786e\u7684\u8f93\u5165\u5e94\u8be5\u5982\u4e0b\uff1a<\/p>\n<p>command1 `command2 `command3` `<\/p>\n<p>\u8981\u4e0d\u7136\uff0c\u6362\u6210 $( ) \u5c31\u6ca1\u95ee\u9898\u4e86\uff1a<\/p>\n<p>command1 $(command2 $(command3))<\/p>\n<p>\u53ea\u8981\u4f60\u559c\u6b22\uff0c\u505a\u591a\u5c11\u5c42\u7684\u66ff\u6362\u90fd\u6ca1\u95ee\u9898\u5566\u3002\u4e0d\u8fc7\uff0c$( ) \u5e76\u4e0d\u662f\u6ca1\u6709\u6bd9\u7aef\u7684\uff0c\u9996\u5148\uff0c` ` \u57fa\u672c\u4e0a\u53ef\u7528\u5728\u5168\u90e8\u7684 unix shell \u4e2d\u4f7f\u7528\uff0c\u82e5\u5199\u6210 shell script \uff0c\u5176\u79fb\u690d\u6027\u6bd4\u8f83\u9ad8\u3002\u800c $( ) \u5e76\u4e0d\u89c1\u7684\u6bcf\u4e00\u79cd shell \u90fd\u80fd\u4f7f\u7528\uff0c\u6211\u53ea\u80fd\u8ddf\u4f60\u8bf4\uff0c\u82e5\u4f60\u7528 bash2 \u7684\u8bdd\uff0c\u80af\u5b9a\u6ca1\u95ee\u9898\u3002\u63a5\u4e0b\u6765\uff0c\u518d\u8ba9\u6211\u4eec\u770b <strong>${ }<\/strong>\u5427\u3002\u5b83\u5176\u5b9e\u5c31\u662f\u7528\u6765\u4f5c<strong>\u53d8\u91cf\u66ff\u6362<\/strong>\u7528\u7684\u5566\u3002\u4e00\u822c\u60c5\u51b5\u4e0b\uff0c$var \u4e0e ${var} \u5e76\u6ca1\u6709\u5565\u4e0d\u4e00\u6837\u3002\u4f46\u662f\u7528 ${ } \u4f1a\u6bd4\u8f83\u7cbe\u786e\u7684\u754c\u5b9a\u53d8\u91cf\u540d\u79f0\u7684\u8303\u56f4\uff0c\u6bd4\u65b9\u8bf4\uff1a<\/p>\n<p>$ A=B<\/p>\n<p>$ echo $AB<\/p>\n<p>\u539f\u672c\u662f\u6253\u7b97\u5148\u5c06 $A \u7684\u7ed3\u679c\u66ff\u6362\u51fa\u6765\uff0c\u7136\u540e\u518d\u8865\u4e00\u4e2a B \u5b57\u6bcd\u4e8e\u5176\u540e\uff0c\u4f46\u5728\u547d\u4ee4\u884c\u4e0a\uff0c\u771f\u6b63\u7684\u7ed3\u679c\u5374\u662f\u53ea\u4f1a\u63d0\u6362\u53d8\u91cf\u540d\u79f0\u4e3a AB \u7684\u503c\u51fa\u6765\uff0c\u82e5\u4f7f\u7528 ${ } \u5c31\u6ca1\u95ee\u9898\u4e86\uff1a<\/p>\n<p>$ echo ${A}B<\/p>\n<p>BB<\/p>\n<p>\u4e0d\u8fc7\uff0c\u5047\u5982\u4f60\u53ea\u770b\u5230 ${ } \u53ea\u80fd\u7528\u6765\u754c\u5b9a\u53d8\u91cf\u540d\u79f0\u7684\u8bdd\uff0c\u90a3\u4f60\u5c31\u5b9e\u5728\u592a\u5c0f\u770b bash \u4e86\ufe57\u6709\u5174\u8da3\u7684\u8bdd\uff0c\u4f60\u53ef\u5148\u53c2\u8003\u4e00\u4e0b cu \u672c\u7248\u7684\u7cbe\u534e\u6587\u7ae0\uff1a<a href=\"http:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=201843\">http:\/\/www.chinaunix.net\/forum\/viewtopic.php?t=201843<\/a>\uff0c\u4e3a\u4e86\u5b8c\u6574\u8d77\u89c1\uff0c\u6211\u8fd9\u91cc\u518d\u7528\u4e00\u4e9b\u4f8b\u5b50\u52a0\u4ee5\u8bf4\u660e ${ } \u7684\u4e00\u4e9b\u7279\u5f02\u529f\u80fd\uff1a<\/p>\n<p>\u5047\u8bbe\u6211\u4eec\u5b9a\u4e49\u4e86\u4e00\u4e2a\u53d8\u91cf\u4e3a\uff1a<\/p>\n<p>file=\/dir1\/dir2\/dir3\/my.file.txt<\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u7528 ${ } \u5206\u522b\u66ff\u6362\u83b7\u5f97\u4e0d\u540c\u7684\u503c\uff1a<\/p>\n<p>${file#*\/}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u62ff\u6389\u7b2c\u4e00\u6761 \/ \u53ca\u5176\u5de6\u8fb9\u7684\u5b57\u7b26\u4e32\uff1adir1\/dir2\/dir3\/my.file.txt<\/p>\n<p>${file##*\/}\u00a0\u00a0\u00a0\u00a0 \u62ff\u6389\u6700\u540e\u4e00\u6761 \/ \u53ca\u5176\u5de6\u8fb9\u7684\u5b57\u7b26\u4e32\uff1amy.file.txt<\/p>\n<p>${file#*.}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u62ff\u6389\u7b2c\u4e00\u4e2a .\u00a0\u00a0\u53ca\u5176\u5de6\u8fb9\u7684\u5b57\u7b26\u4e32\uff1afile.txt<\/p>\n<p>${file##*.}\u00a0\u00a0\u00a0\u00a0 \u62ff\u6389\u6700\u540e\u4e00\u4e2a .\u00a0\u00a0\u53ca\u5176\u5de6\u8fb9\u7684\u5b57\u7b26\u4e32\uff1atxt<\/p>\n<p>${file%\/*}\u00a0\u00a0\u00a0\u00a0 \u62ff\u6389\u6700\u540e\u6761 \/ \u53ca\u5176\u53f3\u8fb9\u7684\u5b57\u7b26\u4e32\uff1a\/dir1\/dir2\/dir3<\/p>\n<p>${file%%\/*}\u00a0 \u62ff\u6389\u7b2c\u4e00\u6761 \/ \u53ca\u5176\u53f3\u8fb9\u7684\u5b57\u7b26\u4e32\uff1a(\u7a7a\u503c)<\/p>\n<p>${file%.*}\u00a0\u00a0\u00a0\u00a0 \u62ff\u6389\u6700\u540e\u4e00\u4e2a .\u00a0\u00a0\u53ca\u5176\u53f3\u8fb9\u7684\u5b57\u7b26\u4e32\uff1a\/dir1\/dir2\/dir3\/my.file<\/p>\n<p>${file%%.*}\u00a0 \u62ff\u6389\u7b2c\u4e00\u4e2a .\u00a0\u00a0\u53ca\u5176\u53f3\u8fb9\u7684\u5b57\u7b26\u4e32\uff1a\/dir1\/dir2\/dir3\/my<\/p>\n<p>\u8bb0\u5fc6\u7684\u65b9\u6cd5\u4e3a\uff1a<\/p>\n<p># \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u662f\u53bb\u6389\u5de6\u8fb9(\u5728\u9274\u76d8\u4e0a # \u5728 $ \u4e4b\u5de6\u8fb9)<\/p>\n<p>% \u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u662f\u53bb\u6389\u53f3\u8fb9(\u5728\u9274\u76d8\u4e0a % \u5728 $ \u4e4b\u53f3\u8fb9)<\/p>\n<p>\u5355\u4e00\u7b26\u53f7\u662f\u6700\u5c0f\u5339\u914d\ufe54\u4e24\u4e2a\u7b26\u53f7\u662f\u6700\u5927\u5339\u914d\u3002<\/p>\n<p>${file:0:5}\u00a0\u00a0\u00a0\u00a0\u00a0 \u63d0\u53d6\u6700\u5de6\u8fb9\u7684 5 \u4e2a\u5b57\u8282\uff1a\/dir1<\/p>\n<p>${file:5:5}\u00a0\u00a0\u00a0\u00a0\u00a0 \u63d0\u53d6\u7b2c 5 \u4e2a\u5b57\u8282\u53f3\u8fb9\u7684\u8fde\u7eed 5 \u4e2a\u5b57\u8282\uff1a\/dir2<\/p>\n<p>\u6211\u4eec\u4e5f\u53ef\u4ee5\u5bf9\u53d8\u91cf\u503c\u91cc\u7684\u5b57\u7b26\u4e32\u4f5c\u66ff\u6362\uff1a<\/p>\n<p>${file\/dir\/path}\u00a0\u00a0\u00a0\u00a0\u00a0 \u5c06\u7b2c\u4e00\u4e2a dir \u63d0\u6362\u4e3a path\uff1a\/path1\/dir2\/dir3\/my.file.txt<\/p>\n<p>${file\/\/dir\/path}\u00a0\u00a0\u00a0\u00a0 \u5c06\u5168\u90e8 dir \u63d0\u6362\u4e3a path\uff1a\/path1\/path2\/path3\/my.file.txt<\/p>\n<p>\u5229\u7528 ${ } \u8fd8\u53ef\u9488\u5bf9\u4e0d\u540c\u7684\u53d8\u91cf\u72b6\u6001\u8d4b\u503c(\u6ca1\u8bbe\u5b9a\u3001\u7a7a\u503c\u3001\u975e\u7a7a\u503c)\uff1a<\/p>\n<p>${file-my.file.txt}\u00a0 \u5047\u5982 $file \u6ca1\u6709\u8bbe\u5b9a\uff0c\u5219\u4f7f\u7528 my.file.txt \u4f5c\u4f20\u56de\u503c\u3002(\u7a7a\u503c\u53ca\u975e\u7a7a\u503c\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>${file:-my.file.txt}\u5047\u5982 $file \u6ca1\u6709\u8bbe\u5b9a\u6216\u4e3a\u7a7a\u503c\uff0c\u5219\u4f7f\u7528 my.file.txt \u4f5c\u4f20\u56de\u503c\u3002 (\u975e\u7a7a\u503c\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>${file+my.file.txt}\u5047\u5982 $file \u8bbe\u4e3a\u7a7a\u503c\u6216\u975e\u7a7a\u503c\uff0c\u5747\u4f7f\u7528 my.file.txt \u4f5c\u4f20\u56de\u503c\u3002(\u6ca1\u8bbe\u5b9a\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>${file:+my.file.txt}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u82e5 $file \u4e3a\u975e\u7a7a\u503c\uff0c\u5219\u4f7f\u7528 my.file.txt \u4f5c\u4f20\u56de\u503c\u3002 (\u6ca1\u8bbe\u5b9a\u53ca\u7a7a\u503c\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>${file=my.file.txt}\u82e5 $file \u6ca1\u8bbe\u5b9a\uff0c\u5219\u4f7f\u7528 my.file.txt \u4f5c\u4f20\u56de\u503c\uff0c\u540c\u65f6\u5c06 $file \u8d4b\u503c\u4e3a my.file.txt \u3002 (\u7a7a\u503c\u53ca\u975e\u7a7a\u503c\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>${file:=my.file.txt}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u82e5 $file \u6ca1\u8bbe\u5b9a\u6216\u4e3a\u7a7a\u503c\uff0c\u5219\u4f7f\u7528 my.file.txt \u4f5c\u4f20\u56de\u503c\uff0c\u540c\u65f6\u5c06 $file \u8d4b\u503c\u4e3a my.file.txt \u3002 (\u975e\u7a7a\u503c\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>${file?my.file.txt}\u00a0 \u82e5 $file \u6ca1\u8bbe\u5b9a\uff0c\u5219\u5c06 my.file.txt \u8f93\u51fa\u81f3 STDERR\u3002 (\u7a7a\u503c\u53ca\u975e\u7a7a\u503c\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>${file:?my.file.txt}\u82e5 $file \u6ca1\u8bbe\u5b9a\u6216\u4e3a\u7a7a\u503c\uff0c\u5219\u5c06 my.file.txt \u8f93\u51fa\u81f3 STDERR\u3002 (\u975e\u7a7a\u503c\u65f6\u4e0d\u4f5c\u5904\u7406)<\/p>\n<p>\u4ee5\u4e0a\u7684\u7406\u89e3\u5728\u4e8e\u4f60\u4e00\u5b9a\u8981\u5206\u6e05\u695a unset \u4e0e null \u53ca non-null \u8fd9\u4e09\u79cd\u8d4b\u503c\u72b6\u6001\u3002\u4e00\u822c\u800c\u8a00, : \u4e0e null \u6709\u5173, \u82e5\u4e0d\u5e26 : \u7684\u8bdd, null \u4e0d\u53d7\u5f71\u54cd, \u82e5\u5e26 : \u5219\u8fde null \u4e5f\u53d7\u5f71\u54cd\u3002\u8fd8\u6709\u54e6\uff0c${#var} \u53ef\u8ba1\u7b97\u51fa\u53d8\u91cf\u503c\u7684\u957f\u5ea6\uff1a<\/p>\n<p>${#file}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u53ef\u5f97\u5230 27 \uff0c\u56e0\u4e3a \/dir1\/dir2\/dir3\/my.file.txt \u521a\u597d\u662f 27 \u4e2a\u5b57\u8282\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u518d\u4e3a\u5927\u5bb6\u4ecb\u7a0d\u4e00\u4e0b bash \u7684\u7ec4\u6570(array)\u5904\u7406\u65b9\u6cd5\u3002\u4e00\u822c\u800c\u8a00\uff0cA=&#8221;a b c def&#8221; \u8fd9\u6837\u7684\u53d8\u91cf\u53ea\u662f\u5c06 $A \u66ff\u6362\u4e3a\u4e00\u4e2a\u5355\u4e00\u7684\u5b57\u7b26\u4e32\uff0c\u4f46\u662f\u6539\u4e3a A=(a b c def) \uff0c\u5219\u662f\u5c06 $A \u5b9a\u4e49\u4e3a\u7ec4\u6570\u3002bash \u7684\u7ec4\u6570\u66ff\u6362\u65b9\u6cd5\u53ef\u53c2\u8003\u5982\u4e0b\u65b9\u6cd5\uff1a<\/p>\n<p>${A[@]} \u6216 ${A[*]} \u53ef\u5f97\u5230 a b c def (\u5168\u90e8\u7ec4\u6570)<\/p>\n<p>${A[0]} \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u53ef\u5f97\u5230 a (\u7b2c\u4e00\u4e2a\u7ec4\u6570)\uff0c${A[1]} \u5219\u4e3a\u7b2c\u4e8c\u4e2a\u7ec4\u6570<\/p>\n<p>${#A[@]} \u00a0\u00a0\u00a0 \u6216 ${#A[*]} \u53ef\u5f97\u5230 4 (\u5168\u90e8\u7ec4\u6570\u6570\u91cf)<\/p>\n<p>${#A[0]} \u00a0\u00a0\u00a0\u00a0\u00a0 \u53ef\u5f97\u5230 1 (\u5373\u7b2c\u4e00\u4e2a\u7ec4\u6570(a)\u7684\u957f\u5ea6)\uff0c${#A[3]} \u53ef\u5f97\u5230 3 (\u7b2c\u56db\u4e2a\u7ec4\u6570(def)\u7684\u957f\u5ea6) A[3]=xyz \u5219\u662f\u5c06\u7b2c\u56db\u4e2a\u7ec4\u6570\u91cd\u65b0\u5b9a\u4e49\u4e3a xyz \u3002<\/p>\n<p>\u8bf8\u5982\u6b64\u7c7b\u7684\uff0c\u80fd\u591f\u5584\u7528 bash \u7684 $( ) \u4e0e ${ } \u53ef\u5927\u5927\u63d0\u9ad8\u53ca\u7b80\u5316 shell \u5728\u53d8\u91cf\u4e0a\u7684\u5904\u7406\u80fd\u529b\u54e6\u3002\u597d\u4e86\uff0c\u6700\u540e\u4e3a\u5927\u5bb6\u4ecb\u7ecd <strong>$(( )) <\/strong>\u7684\u7528\u9014\u5427\uff1a\u5b83\u662f\u7528\u6765\u4f5c<strong>\u6574\u6570\u8fd0\u7b97<\/strong>\u7684\u3002\u5728 bash \u4e2d\uff0c$(( )) \u7684\u6574\u6570\u8fd0\u7b97\u7b26\u53f7\u5927\u81f4\u6709\u8fd9\u4e9b\uff1a<\/p>\n<p>+ &#8211; * \/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5206\u522b\u4e3a\u201c\u52a0\u3001\u51cf\u3001\u4e58\u3001\u9664\u201d\u3002<\/p>\n<p>%\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u4f59\u6570\u8fd0\u7b97<\/p>\n<p>&amp; | ^ !\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5206\u522b\u4e3a\u201cAND\u3001OR\u3001XOR\u3001NOT\u201d\u8fd0\u7b97\u3002<\/p>\n<p>\u4f8b\uff1a<\/p>\n<p>$ a=5; b=7; c=2<\/p>\n<p>$ echo $(( a+b*c ))<\/p>\n<p>19<\/p>\n<p>$ echo $(( (a+b)\/c ))<\/p>\n<p>6<\/p>\n<p>$ echo $(( (a*b)%c))<\/p>\n<p>1<\/p>\n<p>\u5728 $(( )) \u4e2d\u7684\u53d8\u91cf\u540d\u79f0\uff0c\u53ef\u4e8e\u5176\u524d\u9762\u52a0 $ \u7b26\u53f7\u6765\u66ff\u6362\uff0c\u4e5f\u53ef\u4ee5\u4e0d\u7528\uff0c\u5982\uff1a$(( $a + $b * $c)) \u4e5f\u53ef\u5f97\u5230 19 \u7684\u7ed3\u679c<\/p>\n<p>\u6b64\u5916\uff0c$(( )) \u8fd8\u53ef\u4f5c\u4e0d\u540c\u8fdb\u4f4d(\u5982\u4e8c\u8fdb\u5236\u3001\u516b\u8fdb\u4f4d\u3001\u5341\u516d\u8fdb\u5236)\u4f5c\u8fd0\u7b97\u5462\uff0c\u53ea\u662f\uff0c\u8f93\u51fa\u7ed3\u679c\u7686\u4e3a\u5341\u8fdb\u5236\u800c\u5df2\uff1aecho $((16#2a)) \u7ed3\u679c\u4e3a 42 (16\u8fdb\u4f4d\u8f6c\u5341\u8fdb\u5236)<\/p>\n<p>\u4ee5\u4e00\u4e2a\u5b9e\u7528\u7684\u4f8b\u5b50\u6765\u770b\u770b\u5427\uff1a<\/p>\n<p>\u5047\u5982\u5f53\u524d\u7684\u00a0\u00a0umask \u662f 022 \uff0c\u90a3\u4e48\u65b0\u5efa\u6587\u4ef6\u7684\u6743\u9650\u5373\u4e3a\uff1a<\/p>\n<p>$ umask 022<\/p>\n<p>$ echo &#8220;obase=8;$(( 8#666 &amp; (8#777 ^ 8#$(umask)) ))&#8221; | bc<\/p>\n<p>644<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u5355\u7eaf\u7528 (( )) \u4e5f\u53ef\u91cd\u5b9a\u4e49\u53d8\u91cf\u503c\uff0c\u6216\u4f5c testing\uff1a<\/p>\n<p>a=5; ((a++)) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u53ef\u5c06 $a \u91cd\u5b9a\u4e49\u4e3a 6<\/p>\n<p>a=5; ((a&#8211;)) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5219\u4e3a a=4<\/p>\n<p>a=5; b=7; ((a &lt; b)) \u00a0\u00a0\u00a0\u00a0\u00a0 \u4f1a\u5f97\u5230\u00a0\u00a00 (true) \u7684\u8fd4\u56de\u503c\u3002<\/p>\n<p>\u5e38\u89c1\u7684\u7528\u4e8e (( )) \u7684\u6d4b\u8bd5\u7b26\u53f7\u6709\u5982\u4e0b\u8fd9\u4e9b\uff1a<\/p>\n<p>&lt;\u00a0\u00a0\u00a0\u00a0 \u5c0f\u4e8e<\/p>\n<p>&gt;\u00a0\u00a0\u00a0\u00a0 \u5927\u4e8e<\/p>\n<p>&lt;=\u00a0\u00a0 \u5c0f\u4e8e\u6216\u7b49\u4e8e<\/p>\n<p>&gt;=\u00a0\u00a0 \u5927\u4e8e\u6216\u7b49\u4e8e<\/p>\n<p>==\u00a0\u00a0 \u7b49\u4e8e<\/p>\n<p>!=\u00a0\u00a0\u00a0 \u4e0d\u7b49\u4e8e<\/p>\n<p>\u4e0d\u8fc7\uff0c\u4f7f\u7528 (( )) \u4f5c\u6574\u6570\u6d4b\u8bd5\u65f6\uff0c\u8bf7\u4e0d\u8981\u8ddf [ ] \u7684\u6574\u6570\u6d4b\u8bd5\u641e\u6df7\u4e71\u4e86\u3002(\u66f4\u591a\u7684\u6d4b\u8bd5\u6211\u5c06\u4e8e\u7b2c\u5341\u7ae0\u4e3a\u5927\u5bb6\u4ecb\u7ecd)\u3002\u600e\u6837\uff1f\u597d\u73a9\u5427\uff0c\u8fd9\u6b21\u6682\u65f6\u8bf4\u8fd9\u4e48\u591a\uff0c\u4e0a\u9762\u7684\u4ecb\u7ecd\uff0c\u5e76\u6ca1\u6709\u8be6\u5217\u6bcf\u4e00\u79cd\u53ef\u7528\u7684\u72b6\u6001\uff0c\u66f4\u591a\u7684\uff0c\u5c31\u8bf7\u8bfb\u8005\u53c2\u8003\u624b\u518c\u6587\u4ef6\u5570\u3002<\/p>\n<h1>9 $@ \u4e0e $* \u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u8981\u8bf4 $@ \u4e0e $* \u4e4b\u524d\uff0c\u9700\u5f97\u5148\u4ece shell script \u7684 positional parameter \u8c08\u8d77\u3002\u6211\u4eec\u90fd\u5df2\u7ecf\u77e5\u9053\u53d8\u91cf(variable)\u662f\u5982\u4f55\u5b9a\u4e49\u53ca\u66ff\u6362\u7684\uff0c\u8fd9\u4e2a\u4e0d\u7528\u518d\u591a\u8bb2\u4e86\u3002\u4f46\u662f\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u77e5\u9053\u6709\u4e9b\u53d8\u91cf\u662f shell \u5185\u5b9a\u7684\uff0c\u4e14\u5176\u540d\u79f0\u662f\u6211\u4eec\u4e0d\u80fd\u968f\u610f\u4fee\u6539\u7684\uff0c\u5176\u4e2d\u5c31\u6709 positional parameter \u5728\u5185\u3002<\/p>\n<p>\u5728 shell script \u4e2d\uff0c\u6211\u4eec\u53ef\u7528 $0, $1, $2, $3 &#8230; \u8fd9\u6837\u7684\u53d8\u91cf\u5206\u522b\u63d0\u53d6\u547d\u4ee4\u884c\u4e2d\u7684\u5982\u4e0b\u90e8\u4efd\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">script_name parameter1 parameter2 parameter3 &#8230;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6211\u4eec\u5f88\u5bb9\u6613\u5c31\u80fd\u731c\u51fa $0 \u5c31\u662f\u4ee3\u8868 shell script \u540d\u79f0(\u8def\u5f84)\u672c\u8eab\uff0c\u800c $1 \u5c31\u662f\u5176\u540e\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\uff0c\u5982\u6b64\u7c7b\u63a8\u2026\u987b\u5f97\u7559\u610f\u7684\u662f IFS \u7684\u4f5c\u7528\uff0c\u4e5f\u5c31\u662f\uff0c\u82e5 IFS \u88ab quoting \u5904\u7406\u540e\uff0c\u90a3\u4e48 positional parameter \u4e5f\u4f1a\u6539\u53d8\u3002<\/p>\n<p>\u5982\u4e0b\u4f8b\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">my.sh p1 &#8220;p2 p3&#8221; p4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7531\u4e8e\u5728 p2 \u4e0e p3 \u4e4b\u95f4\u7684\u7a7a\u683c\u952e\u88ab soft quote \u6240\u5173\u95ed\u4e86\uff0c\u56e0\u6b64 my.sh \u4e2d\u7684 $2 \u662f &#8220;p2 p3&#8221; \u800c $3 \u5219\u662f p4\u3002\u8fd8\u8bb0\u5f97\u524d\u4e24\u7ae0\u6211\u4eec\u63d0\u5230 fucntion \u65f6\uff0c\u6211\u4e0d\u662f\u8bf4\u8fc7\u5b83\u662f script \u4e2d\u7684 script \u5417\uff1f\u00a0\u662f\u7684\uff0cfunction \u4e00\u6837\u53ef\u4ee5\u8bfb\u53d6\u81ea\u5df1\u7684(\u6709\u522b\u4e8e script \u7684) postitional parameter \uff0c\u60df\u4e00\u4f8b\u5916\u7684\u662f $0 \u800c\u5df2\u3002\u4e3e\u4f8b\u800c\u8a00\uff1a\u5047\u8bbe my.sh \u91cc\u6709\u4e00\u4e2a fucntion \u53eb my_fun , \u82e5\u5728 script \u4e2d\u8dd1 my_fun fp1 fp2 fp3 \uff0c\u90a3\u4e48\uff0cfunction \u5185\u7684 $0 \u662f my.sh \uff0c\u800c $1 \u5219\u662f fp1 \u800c\u975e p1 \u4e86\u3002\u4e0d\u5982\u5199\u4e2a\u7b80\u5355\u7684 my.sh script\u00a0\u00a0\u770b\u770b\u5427\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">#!\/bin\/bashmy_fun() {<\/p>\n<p>echo &#8216;$0 inside function is &#8216;$0<\/p>\n<p>echo &#8216;$1 inside function is &#8216;$1<\/p>\n<p>echo &#8216;$2 inside function is &#8216;$2<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>echo &#8216;$0 outside function is &#8216;$0<\/p>\n<p>echo &#8216;$1 outside function is &#8216;$1<\/p>\n<p>echo &#8216;$2 outside function is &#8216;$2<\/p>\n<p>&nbsp;<\/p>\n<p>my_fun fp1 &#8220;fp2 fp3&#8221;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7136\u540e\u5728 command line \u4e2d\u8dd1\u4e00\u4e0b script \u5c31\u77e5\u9053\u4e86\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">chmod +x my.sh.\/my.sh p1 &#8220;p2 p3&#8221;<\/p>\n<p>$0 outside function is .\/my.sh<\/p>\n<p>$1 outside function is p1<\/p>\n<p>$2 outside function is p2 p3<\/p>\n<p>$0 inside function is .\/my.sh<\/p>\n<p>$1 inside function is fp1<\/p>\n<p>$2 inside function is fp2 fp3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7136\u800c\uff0c\u5728\u4f7f\u7528 positional parameter \u7684\u65f6\u5019\uff0c\u6211\u4eec\u8981\u6ce8\u610f\u4e00\u4e9b\u9677\u9631\u54e6\uff1a<\/p>\n<p>* $10 \u4e0d\u662f\u66ff\u6362\u7b2c 10 \u4e2a\u53c2\u6570\uff0c\u800c\u662f\u66ff\u6362\u7b2c\u4e00\u4e2a\u53c2\u6570($1)\u7136\u540e\u518d\u8865\u4e00\u4e2a 0 \u4e8e\u5176\u540e\ufe57<\/p>\n<p>\u4e5f\u5c31\u662f\uff0cmy.sh one two three four five six seven eigth nine ten \u8fd9\u6837\u7684 command line \uff0cmy.sh \u91cc\u7684 $10 \u4e0d\u662f ten \u800c\u662f one0 \u54e6\uff0c\u5c0f\u5fc3\u5c0f\u5fc3\ufe57\u8981\u6293\u5230 ten \u7684\u8bdd\uff0c\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a<\/p>\n<p>\u65b9\u6cd5\u4e00\u662f\u4f7f\u7528\u6211\u4eec\u4e0a\u4e00\u7ae0\u4ecb\u7ecd\u7684 ${ } \uff0c\u4e5f\u5c31\u662f\u7528 ${10} \u5373\u53ef\u3002<\/p>\n<p>\u65b9\u6cd5\u4e8c\uff0c\u5c31\u662f shift \u4e86\u3002<\/p>\n<p>\u7528\u901a\u4fd7\u7684\u8bf4\u6cd5\u6765\u8bf4\uff0c\u6240\u8c13\u7684 shift \u5c31\u662f\u53d6\u6d88 positional parameter \u4e2d\u6700\u5de6\u8fb9\u7684\u53c2\u6570( $0 \u4e0d\u53d7\u5f71\u54cd)\u3002\u5176\u9ed8\u8ba4\u503c\u4e3a 1 \uff0c\u4e5f\u5c31\u662f shift \u6216 shift 1\u00a0\u00a0\u90fd\u662f\u53d6\u6d88 $1 \uff0c\u800c\u539f\u672c\u7684 $2 \u5219\u53d8\u6210 $1\u3001$3 \u53d8\u6210 $2\u2026\u82e5 shift 3 \u5219\u662f\u53d6\u6d88\u524d\u9762\u4e09\u4e2a\u53c2\u6570\uff0c\u4e5f\u5c31\u662f\u539f\u672c\u7684 $4 \u5c06\u53d8\u6210 $1\u2026\u90a3\uff0c\u4eb2\u7231\u7684\u8bfb\u8005\uff0c\u4f60\u8bf4\u8981 shift \u6389\u591a\u5c11\u4e2a\u53c2\u6570\uff0c\u624d\u53ef\u7528 $1 \u53d6\u5f97 ${10} \u5462\uff1f okay\uff0c\u5f53\u6211\u4eec\u5bf9 positional parameter \u6709\u4e86\u57fa\u672c\u6982\u5ff5\u4e4b\u540e\uff0c\u90a3\u518d\u8ba9\u6211\u4eec\u770b\u770b\u5176\u5b83\u76f8\u5173\u53d8\u91cf\u5427\u3002\u9996\u5148\u662f\uff1a<\/p>\n<p><strong>$#<\/strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5b83\u53ef\u6293\u51fa positional parameter \u7684\u6570\u91cf<\/p>\n<p>\u4ee5\u524d\u9762\u7684 my.sh p1 &#8220;p2 p3&#8221; \u4e3a\u4f8b\uff1a<\/p>\n<p>\u7531\u4e8e p2 \u4e0e p3 \u4e4b\u95f4\u7684 IFS \u662f\u5728 soft quote \u4e2d\uff0c\u56e0\u6b64 $# \u53ef\u5f97\u5230 2 \u7684\u503c\u3002\u4f46\u5982\u679c p2 \u4e0e p3 \u6ca1\u6709\u7f6e\u4e8e quoting \u4e2d\u8bdd\uff0c\u90a3 $# \u5c31\u53ef\u5f97\u5230 3 \u7684\u503c\u4e86\u3002\u540c\u6837\u7684\u9053\u7406\u5728 function \u4e2d\u4e5f\u662f\u4e00\u6837\u7684\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5e38\u5728 shell script \u91cc\u7528\u5982\u4e0b\u65b9\u6cd5\u6d4b\u8bd5 script \u662f\u5426\u6709\u8bfb\u8fdb\u53c2\u6570\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">[ $# = 0 ]<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5047\u5982\u4e3a 0 \uff0c\u90a3\u5c31\u8868\u793a script \u6ca1\u6709\u53c2\u6570\uff0c\u5426\u5219\u5c31\u662f\u6709\u5e26\u53c2\u6570\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\u5c31\u662f $@ \u4e0e $* \uff1a\u7cbe\u786e\u6765\u8bb2\uff0c\u4e24\u8005\u53ea\u6709\u5728 soft quote \u4e2d\u624d\u6709\u5dee\u5f02\uff0c\u5426\u5219\uff0c\u90fd\u8868\u793a\u201c\u5168\u90e8\u53c2\u6570\u201d ( $0 \u9664\u5916)\u3002\u4e3e\u4f8b\u6765\u8bf4\u597d\u4e86\uff1a<\/p>\n<p>\u82e5\u5728 command line \u4e0a\u8dd1 my.sh p1 &#8220;p2 p3&#8221; p4 \u7684\u8bdd\uff0c\u4e0d\u7ba1\u662f $@ \u8fd8\u662f $* \uff0c\u90fd\u53ef\u5f97\u5230 p1 p2 p3 p4 \u5c31\u662f\u4e86\u3002\u4f46\u662f\uff0c\u5982\u679c\u7f6e\u4e8e soft quote \u4e2d\u7684\u8bdd\uff1a<\/p>\n<p>&#8220;$@&#8221; \u5219\u53ef\u5f97\u5230 &#8220;p1&#8221; &#8220;p2 p3&#8221; &#8220;p4&#8243; \u8fd9\u4e09\u4e2a\u4e0d\u540c\u7684\u8bcd (word)\uff1b&#8221;$*&#8221; \u5219\u53ef\u5f97\u5230 &#8220;p1 p2 p3 p4&#8221; \u8fd9\u4e00\u6574\u4e32\u5355\u4e00\u7684\u8bcd\u6bb5\u3002<\/p>\n<p>\u6211\u4eec\u53ef\u4fee\u6539\u4e00\u4e0b\u524d\u9762\u7684 my.sh \uff0c\u4f7f\u4e4b\u5185\u5bb9\u5982\u4e0b\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">#!\/bin\/bashmy_fun() {<\/p>\n<p>echo &#8220;$#&#8221;<\/p>\n<p>}<\/p>\n<p>echo &#8216;the number of parameter in &#8220;$@&#8221; is &#8216;$(my_fun &#8220;$@&#8221;)<\/p>\n<p>echo &#8216;the number of parameter in &#8220;$*&#8221; is &#8216;$(my_fun &#8220;$*&#8221;)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7136\u540e\u518d\u6267\u884c .\/my.sh p1 &#8220;p2 p3&#8221; p4 \u5c31\u77e5\u9053 $@ \u4e0e $* \u5dee\u5728\u54ea\u4e86\u3002<\/p>\n<h1>10 &amp;&amp; \u4e0e || \u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u597d\u4e0d\u5bb9\u6613\uff0c\u8fdb\u5165\u4e24\u4f4d\u6570\u7684\u7ae0\u8282\u4e86\u3002\u4e00\u8def\u8d70\u6765\uff0c\u5f88\u8f9b\u82e6\u5427\uff1f\u4e5f\u5f88\u5feb\u4e50\u5427\uff1f\u5728\u89e3\u7b54\u672c\u7ae0\u9898\u76ee\u4e4b\u524d\uff0c\u5148\u8ba9\u6211\u4eec\u4e86\u89e3\u4e00\u4e2a\u6982\u5ff5\uff1areturn value \ufe57\u6211\u4eec\u5728 shell \u4e0b\u8dd1\u7684\u6bcf\u4e00\u4e2a command \u6216 function \uff0c\u5728\u7ed3\u675f\u7684\u65f6\u5019\u90fd\u4f1a\u4f20\u56de\u7236\u8fdb\u7a0b\u4e00\u4e2a\u503c\uff0c\u79f0\u4e3a return value \u3002\u5728 shell command line \u4e2d\u53ef\u7528 $? \u8fd9\u4e2a\u53d8\u91cf\u5f97\u5230\u6700\u201c\u65b0\u201d\u7684\u4e00\u4e2a return value \uff0c\u4e5f\u5c31\u662f\u521a\u7ed3\u675f\u7684\u90a3\u4e2a\u8fdb\u7a0b\u4f20\u56de\u7684\u503c\u3002Return Value(RV) \u7684\u53d6\u503c\u4e3a 0-255 \u4e4b\u95f4\uff0c\u7531\u7a0b\u5e8f(\u6216 script)\u7684\u4f5c\u8005\u81ea\u884c\u5b9a\u8bae\uff1a<\/p>\n<p>* \u82e5\u5728 script \u91cc\uff0c\u7528 exit RV \u6765\u6307\u5b9a\u5176\u503c\uff0c\u82e5\u6ca1\u6307\u5b9a\uff0c\u5728\u7ed3\u675f\u65f6\u4ee5\u6700\u540e\u4e00\u9053\u547d\u4ee4\u4e4b RV \u4e3a\u503c\u3002<\/p>\n<p>* \u82e5\u5728 function \u91cc\uff0c\u5219\u7528 return RV \u6765\u4ee3\u66ff exit RV \u5373\u53ef\u3002<\/p>\n<p>Return Value \u7684\u4f5c\u7528\uff0c\u662f\u7528\u6765\u5224\u65ad\u8fdb\u7a0b\u7684\u9000\u51fa\u72b6\u6001(exit status)\uff0c\u53ea\u6709\u4e24\u79cd\uff1a<\/p>\n<p>* 0 \u7684\u8bdd\u4e3a\u201c\u771f\u201d ( true )<\/p>\n<p>* \u975e\u00a0\u00a00 \u7684\u8bdd\u4e3a\u201c\u5047\u201d ( false )<\/p>\n<p>\u4e3e\u4e2a\u4f8b\u5b50\u6765\u8bf4\u660e\u597d\u4e86\uff1a\u5047\u8bbe\u5f53\u524d\u76ee\u5f55\u5185\u6709\u4e00\u4efd my.file \u7684\u6587\u4ef6\uff0c\u800c no.file \u662f\u4e0d\u5b58\u5728\u7684\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ touch my.file$ ls my.file<\/p>\n<p>$ echo $?\u00a0 \u00a0 \u00a0 \u00a0 # first echo<\/p>\n<p>0<\/p>\n<p>$ ls no.file<\/p>\n<p>ls: no.file: No such file or directory<\/p>\n<p>$ echo $?\u00a0 \u00a0 \u00a0 \u00a0 # second echo<\/p>\n<p>1<\/p>\n<p>$ echo $?\u00a0 \u00a0 \u00a0 \u00a0 # third echo<\/p>\n<p>0<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u4f8b\u7684\u7b2c\u4e00\u4e2a echo \u662f\u5173\u4e8e ls my.file \u7684 RV \uff0c\u53ef\u5f97\u5230 0 \u7684\u503c\uff0c\u56e0\u6b64\u4e3a true \uff0c\u7b2c\u4e8c\u4e2a echo \u662f\u5173\u4e8e ls no.file \u7684 RV \uff0c\u5219\u5f97\u5230\u975e 0\u00a0\u00a0\u7684\u503c\uff0c\u56e0\u6b64\u4e3a false\uff0c\u7b2c\u4e09\u4e2a echo \u662f\u5173\u4e8e\u7b2c\u4e8c\u4e2a echo $? \u7684 RV \uff0c\u4e3a 0 \u7684\u503c\uff0c\u56e0\u6b64\u4e5f\u4e3a true \u3002\u8bf7\u8bb0\u4f4f\uff1a\u6bcf\u4e00\u4e2a command \u5728\u7ed3\u675f\u65f6\u90fd\u4f1a\u9001\u56de return value \u7684\ufe57\u4e0d\u7ba1\u4f60\u8dd1\u751a\u4e48\u6837\u7684\u547d\u4ee4\u3002\u7136\u800c\uff0c\u6709\u4e00\u4e2a\u547d\u4ee4\u5374\u662f\u201c\u4e13\u95e8\u201d\u7528\u6765\u6d4b\u8bd5\u67d0\u4e00\u6761\u4ef6\u800c\u9001\u51fa return value \u4ee5\u4f9b true \u6216 false \u7684\u5224\u65ad\uff0c\u5b83\u5c31\u662f test \u547d\u4ee4\u4e86\ufe57\u82e5\u4f60\u7528\u7684\u662f bash \uff0c\u8bf7\u5728 command line \u4e0b\u6253 man test \u6216 man bash \u6765\u4e86\u89e3\u8fd9\u4e2a test \u7684\u7528\u6cd5\u3002\u8fd9\u662f\u4f60\u53ef\u7528\u4f5c\u53c2\u8003\u7684\u6700\u7cbe\u786e\u7684\u6587\u4ef6\u4e86\uff0c\u8981\u662f\u542c\u522b\u4eba\u8bf4\u7684\uff0c\u4ec5\u4f5c\u53c2\u8003\u5c31\u597d\u3002\u4e0b\u9762\u6211\u53ea\u7b80\u5355\u4f5c\u4e00\u4e9b\u8f85\u52a9\u8bf4\u660e\uff0c\u5176\u4f59\u7684\u4e00\u5f8b\u4ee5 man \u4e3a\u51c6\u3002\u9996\u5148\uff0ctest \u7684\u8868\u793a\u5f0f\u6211\u4eec\u79f0\u4e3a expression \uff0c\u5176\u547d\u4ee4\u683c\u5f0f\u6709\u4e24\u79cd\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">test expressionor:<\/p>\n<p>[ expression ]<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(\u8bf7\u52a1\u5fc5\u6ce8\u610f [ ] \u4e4b\u95f4\u7684\u7a7a\u683c\u952e\ufe57)<\/p>\n<p>\u7528\u54ea\u4e00\u79cd\u683c\u5f0f\u6ca1\u6240\u8c13\uff0c\u90fd\u662f\u4e00\u6837\u7684\u6548\u679c\u3002(\u6211\u4e2a\u4eba\u6bd4\u8f83\u559c\u6b22\u540e\u8005)\u5176\u6b21\uff0cbash \u7684 test \u76ee\u524d\u652f\u6301\u7684\u6d4b\u8bd5\u5bf9\u50cf\u53ea\u6709\u4e09\u79cd\uff1a<\/p>\n<p>* string\u00a0\u00a0 \u5b57\u7b26\u4e32\uff0c\u4e5f\u5c31\u662f\u7eaf\u6587\u5b57\u3002<\/p>\n<p>* integer\u00a0 \u6574\u6570( 0 \u6216\u6b63\u6574\u6570\uff0c\u4e0d\u542b\u8d1f\u6570\u6216\u5c0f\u6570\u70b9)\u3002<\/p>\n<p>* file\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u6587\u4ef6\u3002<\/p>\n<p>\u8bf7\u521d\u5b66\u8005\u4e00\u5b9a\u8981\u641e\u6e05\u695a\u8fd9\u4e09\u8005\u7684\u5dee\u5f02\uff0c\u56e0\u4e3a test \u6240\u7528\u7684 expression \u662f\u4e0d\u4e00\u6837\u7684\u3002\u4ee5 A=123 \u8fd9\u4e2a\u53d8\u91cf\u4e3a\u4f8b\uff1a<\/p>\n<p>* [ &#8220;$A&#8221; = 123 ]\u00a0\u00a0\u00a0 \u662f\u5b57\u7b26\u4e32\u7684\u6d4b\u8bd5\uff0c\u4ee5\u6d4b\u8bd5 $A \u662f\u5426\u4e3a 1\u30012\u30013 \u8fd9\u4e09\u4e2a\u8fde\u7eed\u7684\u201c\u6587\u5b57\u201d\u3002<\/p>\n<p>* [ &#8220;$A&#8221; -eq 123 ]\u00a0 \u662f\u6574\u6570\u7684\u6d4b\u8bd5\uff0c\u4ee5\u6d4b\u8bd5 $A \u662f\u5426\u7b49\u4e8e\u201c\u4e00\u767e\u4e8c\u5341\u4e09\u201d\u3002<\/p>\n<p>* [ -e &#8220;$A&#8221; ]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u662f\u5173\u4e8e\u6587\u4ef6\u7684\u6d4b\u8bd5\uff0c\u4ee5\u6d4b\u8bd5 123 \u8fd9\u4efd\u201c\u6587\u4ef6\u201d\u662f\u5426\u5b58\u5728\u3002<\/p>\n<p>\u7b2c\u4e09\uff0c\u5f53 expression \u6d4b\u8bd5\u4e3a\u201c\u771f\u201d\u65f6\uff0ctest \u5c31\u9001\u56de 0 (true) \u7684 return value \uff0c\u5426\u5219\u9001\u51fa\u975e 0 (false)\u3002\u82e5\u5728 expression \u4e4b\u524d\u52a0\u4e0a\u4e00\u4e2a \u201c! \u201d (\u611f\u53f9\u53f7)\uff0c\u5219\u662f\u5f53 expression \u4e3a\u201c\u5047\u201d\u65f6\u624d\u9001\u51fa 0 \uff0c\u5426\u5219\u9001\u51fa\u975e 0 \u3002\u540c\u65f6\uff0ctest \u4e5f\u5141\u8bb8\u591a\u91cd\u7684\u8986\u5408\u6d4b\u8bd5\uff1a<\/p>\n<p>* expression1 -a expression2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5f53\u4e24\u4e2a exrepssion \u90fd\u4e3a true \uff0c\u624d\u9001\u51fa 0 \uff0c\u5426\u5219\u9001\u51fa\u975e 0 \u3002<\/p>\n<p>* expression1 -o expression2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u53ea\u9700\u5176\u4e2d\u4e00\u4e2a exrepssion \u4e3a true \uff0c\u5c31\u9001\u51fa 0 \uff0c\u53ea\u6709\u4e24\u8005\u90fd\u4e3a false \u624d\u9001\u51fa\u975e 0 \u3002<\/p>\n<p>\u4f8b\u5982\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">\u00a0[ -d &#8220;$file&#8221; -a -x &#8220;$file&#8221; ]<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u662f\u8868\u793a\u5f53 $file \u662f\u4e00\u4e2a\u76ee\u5f55\u3001\u4e14\u540c\u65f6\u5177\u6709 x \u6743\u9650\u65f6\uff0ctest \u624d\u4f1a\u4e3a true \u3002<\/p>\n<p>\u7b2c\u56db\uff0c\u5728 command line \u4e2d\u4f7f\u7528 test \u65f6\uff0c\u8bf7\u522b\u5fd8\u8bb0\u547d\u4ee4\u884c\u7684\u201c\u91cd\u7ec4\u201d\u7279\u6027\uff0c\u4e5f\u5c31\u662f\u5728\u78b0\u5230 meta \u65f6\u4f1a\u5148\u5904\u7406 meta \u518d\u91cd\u65b0\u7ec4\u5efa\u547d\u4ee4\u884c\u3002(\u8fd9\u4e2a\u7279\u6027\u6211\u5728\u7b2c\u4e8c\u53ca\u7b2c\u56db\u7ae0\u90fd\u66fe\u53cd\u590d\u5f3a\u8c03\u8fc7)\u6bd4\u65b9\u8bf4\uff0c\u82e5 test \u78b0\u5230\u53d8\u91cf\u6216\u547d\u4ee4\u66ff\u6362\u65f6\uff0c\u82e5\u4e0d\u80fd\u6ee1\u8db3 expression \u683c\u5f0f\u65f6\uff0c\u5c06\u4f1a\u5f97\u5230\u8bed\u6cd5\u9519\u8bef\u7684\u7ed3\u679c\u3002\u4e3e\u4f8b\u6765\u8bf4\u597d\u4e86\uff1a<\/p>\n<p>\u5173\u4e8e [ string1 = string2 ] \u8fd9\u4e2a test \u683c\u5f0f\uff0c\u5728 = \u53f7\u4e24\u8fb9\u5fc5\u987b\u8981\u6709\u5b57\u7b26\u4e32\uff0c\u5176\u4e2d\u5305\u62ec\u7a7a(null)\u5b57\u7b26\u4e32(\u53ef\u7528 soft quote\u00a0\u00a0\u6216 hard quote \u53d6\u5f97)\u3002\u5047\u5982 $A \u76ee\u524d\u6ca1\u6709\u5b9a\u4e49\uff0c\u6216\u88ab\u5b9a\u8bae\u4e3a\u7a7a\u5b57\u7b26\u4e32\u7684\u8bdd\uff0c\u90a3\u5982\u4e0b\u7684\u5199\u6cd5\u5c06\u4f1a\u5931\u8d25\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ unset A$ [ $A = abc ]<\/p>\n<p>[: =: unary operator expected<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u662f\u56e0\u4e3a\u547d\u4ee4\u884c\u78b0\u5230\u00a0\u00a0$ \u8fd9\u4e2a meta \u65f6\uff0c\u4f1a\u66ff\u6362 $A \u7684\u503c\uff0c\u7136\u540e\u518d\u91cd\u7ec4\u547d\u4ee4\u884c\uff0c\u90a3\u5c31\u53d8\u6210\u4e86\uff1a [ = abc ]\uff0c\u5982\u6b64\u4e00\u6765 = \u53f7\u5de6\u8fb9\u5c31\u6ca1\u6709\u5b57\u7b26\u4e32\u5b58\u5728\u4e86\uff0c\u56e0\u6b64\u9020\u6210 test \u7684\u8bed\u6cd5\u9519\u8bef\ufe57\u4f46\u662f\uff0c\u4e0b\u9762\u8fd9\u4e2a\u5199\u6cd5\u5219\u662f\u6210\u7acb\u7684\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ [ &#8220;$A&#8221; = abc ]$ echo $?<\/p>\n<p>1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u662f\u56e0\u4e3a\u5728\u547d\u4ee4\u884c\u91cd\u7ec4\u540e\u7684\u7ed3\u679c\u4e3a\uff1a<\/p>\n<p>[ &#8220;&#8221; = abc ]<\/p>\n<p>\u7531\u4e8e = \u5de6\u8fb9\u6211\u4eec\u7528 soft quote \u5f97\u5230\u4e00\u4e2a\u7a7a\u5b57\u7b26\u4e32\uff0c\u800c\u8ba9 test \u8bed\u6cd5\u5f97\u4ee5\u901a\u8fc7\u3002\u8bfb\u8005\u8bf8\u541b\u8bf7\u52a1\u5fc5\u7559\u610f\u8fd9\u4e9b\u7ec6\u8282\u54e6\uff0c\u56e0\u4e3a\u7a0d\u4e00\u4e0d\u614e\uff0c\u5c06\u4f1a\u5bfc\u81f3 test \u7684\u7ed3\u679c\u53d8\u4e86\u4e2a\u6837\ufe57\u82e5\u60a8\u5bf9 test \u8fd8\u4e0d\u662f\u5f88\u6709\u7ecf\u9a8c\u7684\u8bdd\uff0c\u90a3\u5728\u4f7f\u7528 test \u65f6\u4e0d\u59a8\u5148\u91c7\u7528\u5982\u4e0b\u8fd9\u4e00\u4e2a\u201c\u6cd5\u5219\u201d\uff1a<\/p>\n<p>* \u5047\u5982\u5728 test \u4e2d\u78b0\u5230\u53d8\u91cf\u66ff\u6362\uff0c\u7528 soft quote \u662f\u6700\u4fdd\u9669\u7684\ufe57<\/p>\n<p>\u82e5\u4f60\u5bf9 quoting \u4e0d\u719f\u7684\u8bdd\uff0c\u8bf7\u91cd\u65b0\u6e29\u4e60\u7b2c\u56db\u7ae0\u7684\u5185\u5bb9\u5427\u3002okay\uff0c\u5173\u4e8e\u66f4\u591a\u7684 test \u7528\u6cd5\uff0c\u8001\u8bdd\u4e00\u53e5\uff1a\u8bf7\u770b man page \u5427\ufe57\u867d\u7136\u6d0b\u6d0b\u6d12\u6d12\u8bb2\u4e86\u4e00\u5927\u5806\uff0c\u6216\u8bb8\u4f60\u8fd8\u5728\u5600\u5495\uff0c\u90a3\u2026\u90a3\u4e2a return value \u6709\u5565\u7528\u554a\uff1f\ufe57\u95ee\u5f97\u597d\ufe57\u544a\u8bc9\u4f60\uff1areturn value \u7684\u4f5c\u7528\u53ef\u5927\u4e86\ufe57\u82e5\u4f60\u60f3\u8ba9\u4f60\u7684 shell \u53d8\u201c\u806a\u660e\u201d\u7684\u8bdd\uff0c\u5c31\u5168\u9760\u5b83\u4e86\uff1a<\/p>\n<p>* \u6709\u4e86 return value\uff0c\u6211\u4eec\u53ef\u4ee5\u8ba9 shell \u8ddf\u636e\u4e0d\u540c\u7684\u72b6\u6001\u505a\u4e0d\u540c\u7684\u65f6\u60c5\u3002<\/p>\n<p>\u8fd9\u65f6\u5019\uff0c\u624d\u8ba9\u6211\u6765\u63ed\u6653\u672c\u7ae0\u7684\u7b54\u6848\u5427\u3002&amp;&amp; \u4e0e || \u90fd\u662f\u7528\u6765\u201c\u7ec4\u5efa\u201d\u591a\u4e2a command line \u7528\u7684\uff1a<\/p>\n<p>* command1 &amp;&amp; command2 command2 \u53ea\u6709\u5728 RV \u4e3a 0 (true) \u7684\u6761\u4ef6\u4e0b\u6267\u884c\u3002<\/p>\n<p>* command1 || command2\u00a0\u00a0\u00a0\u00a0 command2 \u53ea\u6709\u5728 RV \u4e3a\u975e 0 (false) \u7684\u6761\u4ef6\u4e0b\u6267\u884c\u3002<\/p>\n<p>\u6765\uff0c\u4ee5\u4f8b\u5b50\u6765\u8bf4\u597d\u4e86\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=123$ [ -n &#8220;$A&#8221; ] &amp;&amp; echo &#8220;yes! it&#8217;s ture.&#8221;<\/p>\n<p>yes! it&#8217;s ture.<\/p>\n<p>$ unset A<\/p>\n<p>$ [ -n &#8220;$A&#8221; ] &amp;&amp; echo &#8220;yes! it&#8217;s ture.&#8221;<\/p>\n<p>$ [ -n &#8220;$A&#8221; ] || echo &#8220;no, it&#8217;s NOT ture.&#8221;<\/p>\n<p>no, it&#8217;s NOT ture.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(\u6ce8\uff1a[ -n string ] \u662f\u6d4b\u8bd5 string \u957f\u5ea6\u5927\u4e8e 0 \u5219\u4e3a true )<\/p>\n<p>\u4e0a\u4f8b\u7684\u7b2c\u4e00\u4e2a &amp;&amp; \u547d\u4ee4\u884c\u4e4b\u6240\u4ee5\u4f1a\u6267\u884c\u5176\u53f3\u8fb9\u7684 echo \u547d\u4ee4\uff0c\u662f\u56e0\u4e3a\u4e0a\u4e00\u4e2a test \u9001\u56de\u4e86 0 \u7684 RV \u503c\uff0c\u4f46\u7b2c\u4e8c\u6b21\u5c31\u4e0d\u4f1a\u6267\u884c\uff0c\u56e0\u4e3a\u4e3a test \u9001\u56de\u975e 0 \u7684\u7ed3\u679c\u3002\u540c\u7406\uff0c|| \u53f3\u8fb9\u7684 echo \u4f1a\u88ab\u6267\u884c\uff0c\u5374\u6b63\u662f\u56e0\u4e3a\u5de6\u8fb9\u7684 test \u9001\u56de\u975e 0 \u6240\u5f15\u8d77\u7684\u3002<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u6211\u4eec\u5728\u540c\u4e00\u547d\u4ee4\u884c\u4e2d\uff0c\u53ef\u7528\u591a\u4e2a &amp;&amp; \u6216 || \u6765\u7ec4\u5efa\u5462\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=123$ [ -n &#8220;$A&#8221; ] &amp;&amp; echo &#8220;yes! it&#8217;s ture.&#8221; || echo &#8220;no, it&#8217;s NOT ture.&#8221;<\/p>\n<p>yes! it&#8217;s ture<\/p>\n<p>$ unset A<\/p>\n<p>$ [ -n &#8220;$A&#8221; ] &amp;&amp; echo &#8220;yes! it&#8217;s ture.&#8221; || echo &#8220;no, it&#8217;s NOT ture.&#8221;<\/p>\n<p>no, it&#8217;s NOT ture.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u600e\u6837\uff0c\u4ece\u8fd9\u4e00\u523b\u5f00\u59cb\uff0c\u4f60\u662f\u5426\u89c9\u5f97\u6211\u4eec\u7684 shell \u662f\u201c\u5f88\u806a\u660e\u201d\u7684\u5462\uff1f\u00a0\u597d\u4e86\uff0c\u6700\u540e\uff0c\u5e03\u7f6e\u4e00\u9053\u4e60\u9898\u7ed9\u5927\u5bb6\u505a\u505a\u770b\uff0c\u4e0b\u9762\u7684\u5224\u65ad\u662f\uff1a\u5f53 $A \u88ab\u8d4b\u4e0e\u503c\u65f6\uff0c\u518d\u770b\u662f\u5426\u5c0f\u4e8e 100 \uff0c\u5426\u5219\u9001\u51fa too big! \uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ A=123$ [ -n &#8220;$A&#8221; ] &amp;&amp; [ &#8220;$A&#8221; -lt 100 ] || echo &#8216;too big!&#8217;<\/p>\n<p>too big!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u82e5\u6211\u5c06 A \u53d6\u6d88\uff0c\u7167\u7406\u8bf4\uff0c\u5e94\u8be5\u4e0d\u4f1a\u9001\u6587\u5b57\u624d\u5bf9\u554a(\u56e0\u4e3a\u7b2c\u4e00\u4e2a\u6761\u4ef6\u5c31\u4e0d\u6210\u7acb\u4e86)<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ unset A$ [ -n &#8220;$A&#8221; ] &amp;&amp; [ &#8220;$A&#8221; -lt 100 ] || echo &#8216;too big!&#8217;<\/p>\n<p>too big!<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e3a\u4f55\u4e0a\u9762\u7684\u7ed3\u679c\u4e5f\u53ef\u5f97\u5230\u5462\uff1f\u53c8\uff0c\u5982\u4f55\u89e3\u51b3\u4e4b\u5462\uff1f (\u63d0\u793a\uff1a\u4fee\u6539\u65b9\u6cd5\u5f88\u591a\uff0c\u5176\u4e2d\u4e00\u79cd\u65b9\u6cd5\u53ef\u5229\u7528\u7b2c\u4e03\u7ae0\u4ecb\u7ecd\u8fc7\u7684 command group)<\/p>\n<p>&nbsp;<\/p>\n<h1>11 &gt; \u4e0e &lt; \u5dee\u5728\u54ea\uff1f<\/h1>\n<h2>11.1<\/h2>\n<p>\u8c08\u5230 I\/O redirection \uff0c\u4e0d\u59a8\u5148\u8ba9\u6211\u4eec\u8ba4\u8bc6\u4e00\u4e0b File Descriptor (FD) \u3002 \u7a0b\u5e8f\u7684\u8fd0\u7b97\uff0c\u5728\u5927\u90e8\u4efd\u60c5\u51b5\u4e0b\u90fd\u662f\u8fdb\u884c\u6570\u636e(data)\u7684\u5904\u7406\uff0c\u8fd9\u4e9b\u6570\u636e\u4ece\u54ea\u8bfb\u8fdb\uff1f\u53c8\u9001\u51fa\u5230\u54ea\u91cc\u5462\uff1f \u8fd9\u5c31\u662f file descriptor (FD) \u7684\u529f\u7528\u4e86\u3002\u5728 shell \u7a0b\u5e8f\u4e2d\uff0c\u6700\u5e38\u4f7f\u7528\u7684 FD \u5927\u6982\u6709\u4e09\u4e2a\uff0c\u5206\u522b\u4e3a\uff1a<\/p>\n<p>0\u00a0\u00a0\u00a0\u00a0 Standard Input (STDIN)<\/p>\n<p>1\u00a0\u00a0\u00a0\u00a0 Standard Output (STDOUT)<\/p>\n<p>2\u00a0\u00a0\u00a0\u00a0 Standard Error Output (STDERR)<\/p>\n<p>\u5728\u6807\u51c6\u60c5\u51b5\u4e0b\uff0c\u8fd9\u4e9b FD \u5206\u522b\u8ddf\u5982\u4e0b\u8bbe\u5907(device)\u5173\u8054\uff1a<\/p>\n<p>stdin(0)\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 keyboard<\/p>\n<p>stdout(1) \u00a0\u00a0\u00a0\u00a0 monitor<\/p>\n<p>stderr(2)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 monitor<\/p>\n<p>\u6211\u4eec\u53ef\u4ee5\u7528\u5982\u4e0b\u4e0b\u547d\u4ee4\u6d4b\u8bd5\u4e00\u4e0b\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ mail -s test rootthis is a test mail.<\/p>\n<p>please skip.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>^d (\u540c\u65f6\u6309 crtl \u8ddf d \u952e)<\/p>\n<p>\u5f88\u660e\u663e\uff0cmail \u7a0b\u5e8f\u6240\u8bfb\u8fdb\u7684\u6570\u636e\uff0c\u5c31\u662f\u4ece stdin \u4e5f\u5c31\u662f keyboard \u8bfb\u8fdb\u7684\u3002 \u4e0d\u8fc7\uff0c\u4e0d\u89c1\u5f97\u6bcf\u4e2a\u7a0b\u5e8f\u7684 stdin \u90fd\u8ddf mail \u4e00\u6837\u4ece keyboard \u8bfb\u8fdb\uff0c \u56e0\u4e3a\u7a0b\u5e8f\u4f5c\u8005\u53ef\u4ee5\u4ece\u6863\u6848\u53c2\u6570\u8bfb\u8fdb stdin \uff0c\u5982\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ cat \/etc\/passwd<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4f46\u8981\u662f cat \u4e4b\u540e\u6ca1\u6709\u6863\u6848\u53c2\u6570\u5219\u53c8\u5982\u4f55\u5462\uff1f\u54e6\uff0c\u8bf7\u60a8\u81ea\u5df1\u73a9\u73a9\u770b\u5570\u3002<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ cat<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>11.2<\/h2>\n<p>(\u8bf7\u7559\u610f\u6570\u636e\u8f93\u51fa\u5230\u54ea\u91cc\u53bb\u4e86\uff0c\u6700\u540e\u522b\u5fd8\u4e86\u6309 ^d \u79bb\u5f00) \u81f3\u4e8e stdout \u4e0e stderr \uff0c\u55ef\uff0c\u7b49\u6211\u6709\u7a7a\u518d\u7eed\u5427\uff0c\u8fd8\u662f\uff0c\u6709\u54ea\u4f4d\u524d\u8f88\u8981\u6765\u73a9\u63a5\u9f99\u5462\uff1f\u76f8\u4fe1\uff0c\u7ecf\u8fc7\u4e0a\u4e00\u4e2a\u7ec3\u4e60\u540e\uff0c\u4f60\u5bf9 stdin \u4e0e stdout \u5e94\u8be5\u4e0d\u96be\u7406\u89e3\u5427\uff1f\u7136\u540e\uff0c\u8ba9\u6211\u4eec\u7ee7\u7eed\u770b stderr \u597d\u4e86\u3002\u4e8b\u5b9e\u4e0a\uff0cstderr \u6ca1\u751a\u4e48\u96be\u7406\u89e3\u7684\uff1a\u8bf4\u7a7f\u4e86\u5c31\u662f\u201c\u9519\u8bef\u4fe1\u606f\u201d\u8981\u5f80\u54ea\u8fb9\u9001\u800c\u5df2\u3002\u6bd4\u65b9\u8bf4\uff0c\u82e5\u8bfb\u8fdb\u7684\u6863\u6848\u53c2\u6570\u662f\u4e0d\u5b58\u5728\u7684\uff0c\u90a3\u6211\u4eec\u5728 monitor \u4e0a\u5c31\u770b\u5230\u4e86\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls no.such.filels: no.such.file: No such file or directory<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u82e5\uff0c\u4e00\u4e2a\u547d\u4ee4\u540c\u65f6\u4ea7\u751f stdout \u4e0e stderr \u5462\uff1f \u90a3\u8fd8\u4e0d\u7b80\u5355\uff0c\u90fd\u9001\u5230 monitor \u6765\u5c31\u597d\u4e86\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ touch my.file$ ls my.file no.such.file<\/p>\n<p>ls: no.such.file: No such file or directory<\/p>\n<p>my.file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>okay\uff0c\u81f3\u6b64\uff0c\u5173\u4e8e FD \u53ca\u5176\u540d\u79f0\u3001\u8fd8\u6709\u76f8\u5173\u8054\u7684\u8bbe\u5907\uff0c\u76f8\u4fe1\u4f60\u5df2\u7ecf\u6ca1\u95ee\u9898\u4e86\u5427\uff1f \u90a3\u597d\uff0c\u63a5\u4e0b\u6765\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4f55\u6539\u53d8\u8fd9\u4e9b FD \u7684\u9884\u8bbe\u6570\u636e\u4fe1\u9053\uff0c \u6211\u4eec\u53ef\u7528 &lt; \u6765\u6539\u53d8\u8bfb\u8fdb\u7684\u6570\u636e\u4fe1\u9053(stdin)\uff0c\u4f7f\u4e4b\u4ece\u6307\u5b9a\u7684\u6863\u6848\u8bfb\u8fdb\u3002 \u6211\u4eec\u53ef\u7528 &gt; \u6765\u6539\u53d8\u9001\u51fa\u7684\u6570\u636e\u4fe1\u9053(stdout, stderr)\uff0c\u4f7f\u4e4b\u8f93\u51fa\u5230\u6307\u5b9a\u7684\u6863\u6848\u3002\u6bd4\u65b9\u8bf4\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ cat &lt; my.file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5c31\u662f\u4ece my.file \u8bfb\u8fdb\u6570\u636e<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ mail -s test root &lt; \/etc\/passwd<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5219\u662f\u4ece \/etc\/passwd \u8bfb\u8fdb\uff0c\u8fd9\u6837\u4e00\u6765\uff0cstdin \u5c06\u4e0d\u518d\u662f\u4ece keyboard \u8bfb\u8fdb\uff0c\u800c\u662f\u4ece\u6863\u6848\u8bfb\u8fdb\u4e86\uff0c\u4e25\u683c\u6765\u8bf4\uff0c&lt; \u7b26\u53f7\u4e4b\u524d\u9700\u8981\u6307\u5b9a\u4e00\u4e2a FD \u7684(\u4e4b\u95f4\u4e0d\u80fd\u6709\u7a7a\u767d)\uff0c \u4f46\u56e0\u4e3a 0 \u662f &lt; \u7684\u9ed8\u8ba4\u503c\uff0c\u56e0\u6b64 &lt; \u4e0e 0&lt; \u662f\u4e00\u6837\u7684\ufe57okay\uff0c\u8fd9\u4e2a\u597d\u7406\u89e3\u5427\uff1f \u90a3\uff0c\u8981\u662f\u7528\u4e24\u4e2a &lt;&lt; \u53c8\u662f\u5565\u5462\uff1f \u8fd9\u662f\u6240\u8c13\u7684 HERE Document \uff0c\u5b83\u53ef\u4ee5\u8ba9\u6211\u4eec\u8f93\u5165\u4e00\u6bb5\u6587\u672c\uff0c\u76f4\u5230\u8bfb\u5230 &lt;&lt; \u540e\u6307\u5b9a\u7684\u5b57\u7b26\u4e32\u3002 \u6bd4\u65b9\u8bf4\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ cat &lt;&lt;FINISHfirst line here<\/p>\n<p>second line there<\/p>\n<p>third line nowhere<\/p>\n<p>FINISH<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>11.3<\/h2>\n<p>\u8fd9\u6837\u7684\u8bdd\uff0ccat \u4f1a\u8bfb\u8fdb 3 \u884c\u53e5\u5b50\uff0c\u800c\u65e0\u9700\u4ece keyboard \u8bfb\u8fdb\u6570\u636e\u4e14\u8981\u7b49 ^d \u7ed3\u675f\u8f93\u5165\u3002 \u81f3\u4e8e &gt; \u53c8\u5982\u4f55\u5462\uff1f \u5f53\u4f60\u641e\u61c2\u4e86 0&lt; \u539f\u6765\u5c31\u662f\u6539\u53d8 stdin \u7684\u6570\u636e\u8f93\u5165\u4fe1\u9053\u4e4b\u540e\uff0c\u76f8\u4fe1\u8981\u7406\u89e3\u5982\u4e0b\u4e24\u4e2a redirection \u5c31\u4e0d\u96be\u4e86\uff1a<\/p>\n<p>* 1&gt;<\/p>\n<p>* 2&gt;<\/p>\n<p>\u524d\u8005\u662f\u6539\u53d8 stdout \u7684\u6570\u636e\u8f93\u51fa\u4fe1\u9053\uff0c\u540e\u8005\u662f\u6539\u53d8 stderr \u7684\u6570\u636e\u8f93\u51fa\u4fe1\u9053\u3002\u4e24\u8005\u90fd\u662f\u5c06\u539f\u672c\u8981\u9001\u51fa\u5230 monitor \u7684\u6570\u636e\u8f6c\u5411\u8f93\u51fa\u5230\u6307\u5b9a\u6863\u6848\u53bb\u3002 \u7531\u4e8e 1 \u662f &gt; \u7684\u9ed8\u8ba4\u503c\uff0c\u56e0\u6b64\uff0c1&gt; \u4e0e &gt; \u662f\u76f8\u540c\u7684\uff0c\u90fd\u662f\u6539 stdout \u3002\u7528\u4e0a\u6b21\u7684 ls \u4f8b\u5b50\u6765\u8bf4\u660e\u4e00\u4e0b\u597d\u4e86\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file 1&gt;file.outls: no.such.file: No such file or directory<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u6837 monitor \u5c31\u53ea\u5269\u4e0b stderr \u800c\u5df2\u3002\u56e0\u4e3a stdout \u7ed9\u5199\u8fdb file.out \u53bb\u4e86\u3002<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file 2&gt;file.errmy.file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u6837 monitor \u5c31\u53ea\u5269\u4e0b stdout \uff0c\u56e0\u4e3a stderr \u5199\u8fdb\u4e86 file.err \u3002<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file 1&gt;file.out 2&gt;file.err<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u6837 monitor \u5c31\u5565\u4e5f\u6ca1\u6709\uff0c\u56e0\u4e3a stdout \u4e0e stderr \u90fd\u7ed9\u8f6c\u5230\u6863\u6848\u53bb\u4e86\uff0c\u5475~~~ \u770b\u6765\u8981\u7406\u89e3 &gt; \u4e00\u70b9\u4e5f\u4e0d\u96be\u5566\ufe57\u662f\u4e0d\uff1f\u6ca1\u9a97\u4f60\u5427\uff1f\u4e0d\u8fc7\uff0c\u6709\u4e9b\u5730\u65b9\u8fd8\u662f\u8981\u6ce8\u610f\u4e00\u4e0b\u7684\u3002\u9996\u5148\uff0c\u662f\u540c\u65f6\u5199\u5165\u7684\u95ee\u9898\u3002\u6bd4\u65b9\u5982\u4e0b\u8fd9\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file 1&gt;file.both 2&gt;file.both<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5047\u5982 stdout(1) \u4e0e stderr(2) \u90fd\u540c\u65f6\u5728\u5199\u5165 file.both \u7684\u8bdd\uff0c\u5219\u662f\u91c7\u53d6\u201c\u8986\u76d6\u201d\u65b9\u5f0f\uff1a\u540e\u6765\u5199\u5165\u7684\u8986\u76d6\u524d\u9762\u7684\u3002 \u8ba9\u6211\u4eec\u5047\u8bbe\u4e00\u4e2a stdout \u4e0e stderr \u540c\u65f6\u5199\u5165 file.out \u7684\u60c5\u5f62\u597d\u4e86\uff1a<\/p>\n<p>* \u9996\u5148 stdout \u5199\u516510\u4e2a\u5b57\u7b26<\/p>\n<p>* \u7136\u540e stderr \u5199\u5165 6 \u4e2a\u5b57\u7b26<\/p>\n<p>\u90a3\u4e48\uff0c\u8fd9\u65f6\u5019\u539f\u672c stdout \u7684\u524d\u9762 6 \u4e2a\u5b57\u7b26\u5c31\u88ab stderr \u8986\u76d6\u6389\u4e86\u3002\u90a3\uff0c\u5982\u4f55\u89e3\u51b3\u5462\uff1f\u6240\u8c13\u5c71\u4e0d\u8f6c\u8def\u8f6c\u3001\u8def\u4e0d\u8f6c\u4eba\u8f6c\u561b\uff0c \u6211\u4eec\u53ef\u4ee5\u6362\u4e00\u4e2a\u601d\u7ef4\uff1a\u5c06 stderr \u5bfc\u8fdb stdout \u6216\u5c06 stdout \u5bfc\u8fdb sterr \uff0c\u800c\u4e0d\u662f\u5927\u5bb6\u5728\u62a2\u540c\u4e00\u4efd\u6863\u6848\uff0c\u4e0d\u5c31\u884c\u4e86\ufe57 bingo\ufe57\u5c31\u662f\u8fd9\u6837\u5566\uff1a<\/p>\n<p>* 2&gt;&amp;1 \u5c31\u662f\u5c06 stderr \u5e76\u8fdb stdout \u4f5c\u8f93\u51fa<\/p>\n<p>* 1&gt;&amp;2 \u6216 &gt;&amp;2 \u5c31\u662f\u5c06 stdout \u5e76\u8fdb stderr \u4f5c\u8f93\u51fa<\/p>\n<p>\u4e8e\u662f\uff0c\u524d\u9762\u7684\u9519\u8bef\u64cd\u4f5c\u53ef\u4ee5\u6539\u4e3a\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file 1&gt;file.both 2&gt;&amp;1\u6216<\/p>\n<p>$ ls my.file no.such.file 2&gt;file.both &gt;&amp;2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u6837\uff0c\u4e0d\u5c31\u7686\u5927\u6b22\u559c\u4e86\u5417\uff1f\u5475\u3002\u4e0d\u8fc7\uff0c\u5149\u89e3\u51b3\u4e86\u540c\u65f6\u5199\u5165\u7684\u95ee\u9898\u8fd8\u4e0d\u591f\uff0c\u6211\u4eec\u8fd8\u6709\u5176\u5b83\u6280\u5de7\u9700\u8981\u4e86\u89e3\u7684\u3002\u6545\u4e8b\u8fd8\u6ca1\u7ed3\u675f\uff0c\u522b\u8d70\u5f00\ufe57\u5e7f\u544a\u540e\uff0c\u6211\u4eec\u518d\u56de\u6765\ufe57<\/p>\n<h2>11.4<\/h2>\n<p>\u5b66\u4f5b\u7684\u6700\u9ad8\u5883\u754c\uff0c\u5c31\u662f\u201c\u56db\u5927\u7686\u7a7a\u201d\u3002\u81f3\u4e8e\u662f\u7a7a\u54ea\u56db\u5927\u5757\uff1f\u6211\u4e5f\u4e0d\u77e5\uff0c\u56e0\u4e3a\u6211\u8fd8\u6ca1\u5230\u90a3\u5883\u754c\u3002\u4f46\u8fd9\u4e2a\u201c\u7a7a\u201d\u5b57\uff0c\u5374\u975e\u5e38\u503c\u5f97\u6211\u4eec\u8fd4\u590d\u628a\u73a9\u7684\uff1a\u5728 Linux \u6863\u6848\u7cfb\u7edf\u91cc\uff0c\u6709\u4e2a\u8bbe\u5907\u6863\u4f4d\u4e8e \/dev\/null \u3002 \u8bb8\u591a\u4eba\u90fd\u95ee\u8fc7\u6211\u90a3\u662f\u751a\u4e48\u73a9\u610f\u513f\uff1f\u6211\u8ddf\u4f60\u8bf4\u597d\u4e86\uff1a\u90a3\u5c31\u662f\u201c\u7a7a\u201d\u5566\ufe57 \u6ca1\u9519\ufe57\u7a7a\u7a7a\u5982\u4e5f\u7684\u7a7a\u5c31\u662f null \u4e86\u3002\u8bf7\u95ee\u65bd\u4e3b\u662f\u5426\u5ffd\u7136\u6709\u6240\u987f\u8bef\u4e86\u5462\uff1f\u7136\u5219\u606d\u559c\u4e86\u3002\u8fd9\u4e2a null \u5728 I\/O Redirection \u4e2d\u53ef\u6709\u7528\u5f97\u5f88\u5462\uff1a<\/p>\n<p>* \u82e5\u5c06 FD1 \u8ddf FD2 \u8f6c\u5230 \/dev\/null \u53bb\uff0c\u5c31\u53ef\u5c06 stdout \u4e0e stderr \u5f04\u4e0d\u89c1\u6389\u3002<\/p>\n<p>* \u82e5\u5c06 FD0 \u63a5\u5230 \/dev\/null \u6765\uff0c\u90a3\u5c31\u662f\u8bfb\u8fdb nothing \u3002<\/p>\n<p>\u6bd4\u65b9\u8bf4\uff0c\u5f53\u6211\u4eec\u5728\u6267\u884c\u4e00\u4e2a\u7a0b\u5e8f\u65f6\uff0c\u753b\u9762\u4f1a\u540c\u65f6\u9001\u51fa stdout \u8ddf stderr \uff0c\u5047\u5982\u4f60\u4e0d\u60f3\u770b\u5230 stderr (\u4e5f\u4e0d\u60f3\u5b58\u5230\u6863\u6848\u53bb)\uff0c\u90a3\u53ef\u4ee5\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file 2&gt;\/dev\/null<br \/>\nmy.file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u82e5\u8981\u76f8\u53cd\uff1a\u53ea\u60f3\u770b\u5230 stderr \u5462\uff1f\u8fd8\u4e0d\u7b80\u5355\ufe57\u5c06 stdout \u5f04\u5230 null \u5c31\u884c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file &gt;\/dev\/nullls: no.such.file: No such file or directory<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u90a3\u63a5\u4e0b\u6765\uff0c\u5047\u5982\u5355\u7eaf\u53ea\u8dd1\u7a0b\u5e8f\uff0c\u4e0d\u60f3\u770b\u5230\u4efb\u4f55\u8f93\u51fa\u7ed3\u679c\u5462\uff1f \u54e6\uff0c\u8fd9\u91cc\u7559\u4e86\u4e00\u624b\u4e0a\u6b21\u8282\u76ee\u6ca1\u8bb2\u7684\u6cd5\u5b50\uff0c\u4e13\u95e8\u8d60\u4e88\u6709\u7f18\u4eba\ufe57\u9664\u4e86\u7528 &gt;\/dev\/null 2&gt;&amp;1 \u4e4b\u5916\uff0c\u4f60\u8fd8\u53ef\u4ee5\u5982\u6b64\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ ls my.file no.such.file &amp;&gt;\/dev\/null<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(\u63d0\u793a\uff1a\u5c06 &amp;&gt; \u6362\u6210 &gt;&amp; \u4e5f\u884c\u5566~~! ) okay\uff1f\u8bb2\u5b8c\u4f5b\uff0c\u63a5\u4e0b\u6765\uff0c\u518d\u8ba9\u6211\u4eec\u770b\u770b\u5982\u4e0b\u60c5\u51b5\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo &#8220;1&#8221; &gt; file.out$ cat file.out<\/p>\n<p>1<\/p>\n<p>$ echo &#8220;2&#8221; &gt; file.out<\/p>\n<p>$ cat file.out<\/p>\n<p>2<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u770b\u6765\uff0c\u6211\u4eec\u5728\u91cd\u5bfc stdout \u6216 stderr \u8fdb\u4e00\u4efd\u6863\u6848\u65f6\uff0c\u4f3c\u4e4e\u6c38\u8fdc\u53ea\u83b7\u5f97\u6700\u540e\u4e00\u6b21\u5bfc\u5165\u7684\u7ed3\u679c\u3002\u90a3\uff0c\u4e4b\u524d\u7684\u5185\u5bb9\u5462\uff1f \u5475~~~ \u8981\u89e3\u51b3\u8fd9\u4e2a\u95ee\u63d0\u5f88\u7b80\u5355\u5566\uff0c\u5c06 &gt; \u6362\u6210 &gt;&gt; \u5c31\u597d\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo &#8220;3&#8221; &gt;&gt; file.out$ cat file.out<\/p>\n<p>2<\/p>\n<p>3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5982\u6b64\u4e00\u6765\uff0c\u88ab\u91cd\u5bfc\u7684\u76ee\u6807\u6863\u6848\u4e4b\u5185\u5bb9\u5e76\u4e0d\u4f1a\u5931\u53bb\uff0c\u800c\u65b0\u7684\u5185\u5bb9\u5219\u4e00\u76f4\u589e\u52a0\u5728\u6700\u540e\u9762\u53bb\u3002easy \uff1f \u5475 \u3002\u4f46\uff0c\u53ea\u8981\u4f60\u518d\u4e00\u6b21\u7528\u56de\u5355\u4e00\u7684 &gt; \u6765\u91cd\u5bfc\u7684\u8bdd\uff0c\u90a3\u4e48\uff0c\u65e7\u7684\u5185\u5bb9\u8fd8\u662f\u4f1a\u88ab\u201c\u6d17\u201d\u6389\u7684\ufe57 \u8fd9\u65f6\uff0c\u4f60\u8981\u5982\u4f55\u907f\u514d\u5462\uff1f \u5907\u4efd\ufe57 yes \uff0c\u6211\u542c\u5230\u4e86\ufe57\u4e0d\u8fc7\uff0c\u8fd8\u6709\u66f4\u597d\u7684\u5417\uff1f \u65e2\u7136\u4e0e\u65bd\u4e3b\u8fd9\u4e48\u6709\u7f18\u4efd\uff0c\u8001\u7eb3\u5c31\u9001\u4f60\u4e00\u4e2a\u9526\u56ca\u5999\u6cd5\u5427\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ set -o noclobber$ echo &#8220;4&#8221; &gt; file.out<\/p>\n<p>-bash: file: cannot overwrite existing file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u90a3\uff0c\u8981\u5982\u4f55\u53d6\u6d88\u8fd9\u4e2a&#8221;\u9650\u5236&#8221;\u5462\uff1f \u54e6\uff0c\u5c06 set -o \u6362\u6210 set +o \u5c31\u884c\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ set +o noclobber$ echo &#8220;5&#8221; &gt; file.out<\/p>\n<p>$ cat file.out<\/p>\n<p>5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u518d\u95ee\uff1a\u90a3\u6709\u529e\u6cd5\u4e0d\u53d6\u6d88\u800c\u53c8\u201c\u4e34\u65f6\u201d\u76d6\u5199\u76ee\u6807\u6863\u6848\u5417\uff1f \u54e6\uff0c\u4f5b\u66f0\uff1a\u4e0d\u53ef\u544a\u4e5f\ufe57 \u554a~~~ \u5f00\u73a9\u7b11\u7684\u3001\u5f00\u73a9\u7b11\u7684\u5566\uff0c\u5509\uff0c\u65e9\u5c31\u6599\u5230\u4eba\u5fc3\u662f\u4e0d\u8db3\u7684\u4e86\ufe57<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ set -o noclobber$ echo &#8220;6&#8221; &gt;| file.out<\/p>\n<p>$ cat file.out<\/p>\n<p>6<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u7559\u610f\u5230\u6ca1\u6709\uff1a\u5728 &gt; \u540e\u9762\u518d\u52a0\u4e2a\u201c| \u201d\u5c31\u597d(\u6ce8\u610f\uff1a &gt; \u4e0e | \u4e4b\u95f4\u4e0d\u80fd\u6709\u7a7a\u767d\u54e6)\u3002\u518d\u6765\u8fd8\u6709\u4e00\u4e2a\u96be\u9898\u8981\u4f60\u53bb\u53c2\u900f\u7684\u5462\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ echo &#8220;some text here&#8221; &gt; file$ cat &lt; file<\/p>\n<p>some text here<\/p>\n<p>$ cat &lt; file &gt; file.bak<\/p>\n<p>$ cat &lt; file.bak<\/p>\n<p>some text here<\/p>\n<p>$ cat &lt; file &gt; file<\/p>\n<p>$ cat &lt; file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u55ef\uff1f\u6ce8\u610f\u5230\u6ca1\u6709\uff0c\u600e\u4e48\u6700\u540e\u90a3\u4e2a cat \u547d\u4ee4\u770b\u5230\u7684 file \u7adf\u662f\u7a7a\u7684\uff1f\ufe57 why? why? why? \u524d\u9762\u63d0\u5230\uff1a$ cat &lt; file &gt; file \u4e4b\u540e\u539f\u672c\u6709\u5185\u5bb9\u7684\u6863\u6848\u7ed3\u679c\u5374\u88ab\u6d17\u6389\u4e86\ufe57 \u8981\u7406\u89e3\u8fd9\u4e00\u73b0\u50cf\u5176\u5b9e\u4e0d\u96be\uff0c\u8fd9\u53ea\u662f priority \u7684\u95ee\u9898\u800c\u5df2\uff1a<\/p>\n<p>* \u5728 IO Redirection \u4e2d\uff0cstdout \u4e0e stderr \u7684\u7ba1\u9053\u4f1a\u5148\u51c6\u5907\u597d\uff0c\u624d\u4f1a\u4ece stdin \u8bfb\u8fdb\u8d44\u6599\u3002<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff0c\u5728\u4e0a\u4f8b\u4e2d\uff0c&gt; file \u4f1a\u5148\u5c06 file \u6e05\u7a7a\uff0c\u7136\u540e\u624d\u8bfb\u8fdb &lt; file \uff0c \u4f46\u8fd9\u65f6\u5019\u6863\u6848\u5df2\u7ecf\u88ab\u6e05\u7a7a\u4e86\uff0c\u56e0\u6b64\u5c31\u53d8\u6210\u8bfb\u4e0d\u8fdb\u4efb\u4f55\u6570\u636e\u4e86\uff0c\u54e6\uff0c\u539f\u6765\u5982\u6b64\uff0c\u90a3\u5982\u4e0b\u4e24\u4f8b\u53c8\u5982\u4f55\u5462\uff1f<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">$ cat &lt;&gt; file$ cat &lt; file &gt;&gt; file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u55ef\uff0c\u540c\u5b66\u4eec\uff0c\u8fd9\u4e24\u4e2a\u7b54\u6848\u5c31\u5f53\u7ec3\u4e60\u9898\u5570\uff0c\u4e0b\u8282\u8bfe\u4e4b\u524d\u8bf7\u4ea4\u4f5c\u4e1a\ufe57 \u597d\u4e86\uff0cI\/O Redirection \u4e5f\u5feb\u8bb2\u5b8c\u4e86\uff0csorry\uff0c\u56e0\u4e3a\u6211\u4e5f\u53ea\u77e5\u9053\u8fd9\u4e48\u591a\u800c\u5df2\u5566\uff0c\u4e0d\u8fc7\uff0c\u8fd8\u6709\u4e00\u6837\u4e1c\u4e1c\u662f\u4e00\u5b9a\u8981\u8bb2\u7684\uff0c\u5404\u4f4d\u89c2\u4f17\uff1a \u5c31\u662f pipe line \u4e5f\ufe57\u8c08\u5230 pipe line \uff0c\u6211\u76f8\u4fe1\u4e0d\u5c11\u4eba\u90fd\u4e0d\u4f1a\u964c\u751f\uff1a\u6211\u4eec\u5728\u5f88\u591a command line \u4e0a\u5e38\u770b\u5230\u7684\u201c| \u201d\u7b26\u53f7\u5c31\u662f pipe line \u4e86\u3002 \u4e0d\u8fc7\uff0c\u7a76\u7adf pipe line \u662f\u751a\u4e48\u4e1c\u4e1c\u5462\uff1f \u522b\u6025\u522b\u6025\uff0c\u5148\u67e5\u4e00\u4e0b\u82f1\u6c49\u5b57\u5178\uff0c\u770b\u770b pipe \u662f\u751a\u4e48\u610f\u601d\uff1f \u6ca1\u9519\ufe57\u5b83\u5c31\u662f\u201c\u6c34\u7ba1\u201d\u7684\u610f\u601d\uff0c\u90a3\u4e48\uff0c\u4f60\u80fd\u60f3\u8c61\u4e00\u4e0b\u6c34\u7ba1\u662f\u600e\u4e48\u4e00\u6839\u63a5\u7740\u4e00\u6839\u7684\u5417\uff1f\u53c8\uff0c\u6bcf\u6839\u6c34\u7ba1\u4e4b\u95f4\u7684 input \u8ddf output \u53c8\u5982\u4f55\u5462\uff1f\u7075\u5149\u4e00\u95ea\uff1a\u539f\u6765 pipe line \u7684 I\/O \u8ddf\u6c34\u7ba1\u7684 I\/O \u662f\u4e00\u6a21\u4e00\u6837\u7684\uff1a<\/p>\n<p>* \u4e0a\u4e00\u4e2a\u547d\u4ee4\u7684 stdout \u63a5\u5230\u4e0b\u4e00\u4e2a\u547d\u4ee4\u7684 stdin \u53bb\u4e86\ufe57<\/p>\n<p>\u7684\u786e\u5982\u6b64\uff0c\u4e0d\u7ba1\u5728 command line \u4e0a\u4f60\u4f7f\u7528\u4e86\u591a\u5c11\u4e2a pipe line \uff0c \u524d\u540e\u4e24\u4e2a command \u7684 I\/O \u90fd\u662f\u5f7c\u6b64\u8fde\u63a5\u7684\ufe57(\u606d\u559c\uff1a\u4f60\u7ec8\u4e8e\u5f00\u7a8d\u4e86\ufe57)\u3002\u4f46\u662fstderr \u5462\uff1f \u597d\u95ee\u9898\ufe57\u4e0d\u8fc7\u4e5f\u5bb9\u6613\u7406\u89e3\uff1a<\/p>\n<p>* \u82e5\u6c34\u7ba1\u6f0f\u6c34\u600e\u4e48\u529e\uff1f<\/p>\n<p>\u4e5f\u5c31\u662f\u8bf4\uff1a\u5728 pipe line \u4e4b\u95f4\uff0c\u524d\u4e00\u4e2a\u547d\u4ee4\u7684 stderr \u662f\u4e0d\u4f1a\u63a5\u8fdb\u4e0b\u4e00\u547d\u4ee4\u7684 stdin \u7684\uff0c \u5176\u8f93\u51fa\uff0c\u82e5\u4e0d\u7528 2&gt; \u5bfc\u5230 file \u53bb\u7684\u8bdd\uff0c\u5b83\u8fd8\u662f\u9001\u5230\u76d1\u89c6\u5668\u4e0a\u9762\u6765\ufe57 \u8fd9\u70b9\u8bf7\u4f60\u5728 pipe line \u8fd0\u7528\u4e0a\u52a1\u5fc5\u8981\u6ce8\u610f\u7684\u3002 \u90a3\uff0c\u6216\u8bb8\u4f60\u53c8\u4f1a\u95ee\uff1a<\/p>\n<p>* \u6709\u529e\u6cd5\u5c06 stderr \u4e5f\u5582\u8fdb\u4e0b\u4e00\u4e2a\u547d\u4ee4\u7684 stdin \u53bb\u5417\uff1f<\/p>\n<p>\u65b9\u6cd5\u5f53\u7136\u662f\u6709\uff0c\u800c\u4e14\u4f60\u65e9\u5df2\u5b66\u8fc7\u4e86\ufe57\u6211\u63d0\u793a\u4e00\u4e0b\u5c31\u597d\uff1a<\/p>\n<p>* \u8bf7\u95ee\u4f60\u5982\u4f55\u5c06 stderr \u5408\u5e76\u8fdb stdout \u4e00\u540c\u8f93\u51fa\u5462\uff1f<\/p>\n<p>\u82e5\u4f60\u7b54\u4e0d\u51fa\u6765\uff0c\u4e0b\u8bfe\u4e4b\u540e\u518d\u6765\u95ee\u6211\u5427 (\u5982\u679c\u4f60\u8138\u76ae\u771f\u591f\u539a\u7684\u8bdd) \u3002\u6216\u8bb8\uff0c\u4f60\u4ecd\u610f\u5c24\u672a\u5c3d\ufe57\u6216\u8bb8\uff0c\u4f60\u66fe\u7ecf\u78b0\u5230\u8fc7\u4e0b\u9762\u7684\u95ee\u9898\uff1a<\/p>\n<p>* \u5728 cm1 | cm2 | cm3\u2026\u8fd9\u6bb5 pipe line \u4e2d\uff0c\u82e5\u8981\u5c06 cm2 \u7684\u7ed3\u679c\u5b58\u5230\u67d0\u4e00\u6863\u6848\u5462\uff1f<\/p>\n<p>\u82e5\u4f60\u5199\u6210 cm1 | cm2 &gt; file | cm3 \u7684\u8bdd\uff0c\u90a3\u4f60\u80af\u5b9a\u4f1a\u53d1\u73b0 cm3 \u7684 stdin \u662f\u7a7a\u7684\ufe57(\u5f53\u7136\u5566\uff0c\u4f60\u90fd\u5c06\u6c34\u7ba1\u63a5\u5230\u522b\u7684\u6c34\u6c60\u4e86\ufe57) \u806a\u660e\u7684\u4f60\u6216\u8bb8\u4f1a\u5982\u6b64\u89e3\u51b3\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">cm1 | cm2 &gt; file ; cm3 &lt; file<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u662f\u7684\uff0c\u4f60\u7684\u786e\u53ef\u4ee5\u8fd9\u6837\u505a\uff0c\u4f46\u6700\u5927\u7684\u574f\u5904\u662f\uff1a\u8fd9\u6837\u4e00\u6765\uff0cfile I\/O \u4f1a\u53d8\u53cc\u500d\ufe57 \u5728 command \u6267\u884c\u7684\u6574\u4e2a\u8fc7\u7a0b\u4e2d\uff0cfile I\/O \u662f\u6700\u5e38\u89c1\u7684\u6700\u5927\u6548\u80fd\u6740\u624b\u3002 \u51e1\u662f\u6709\u7ecf\u9a8c\u7684 shell \u64cd\u4f5c\u8005\uff0c\u90fd\u4f1a\u5c3d\u91cf\u907f\u514d\u6216\u964d\u4f4e file I\/O \u7684\u9891\u7387\u3002 \u90a3\uff0c\u4e0a\u9762\u95ee\u9898\u8fd8\u6709\u66f4\u597d\u65b9\u6cd5\u5417\uff1f\u6709\u7684\uff0c\u90a3\u5c31\u662f tee \u547d\u4ee4\u4e86\u3002<\/p>\n<p>* \u6240\u8c13 tee \u547d\u4ee4\u662f\u5728\u4e0d\u5f71\u54cd\u539f\u672c I\/O \u7684\u60c5\u51b5\u4e0b\uff0c\u5c06 stdout \u590d\u5236\u4e00\u4efd\u5230\u6863\u6848\u53bb\u3002<\/p>\n<p>\u56e0\u6b64\uff0c\u4e0a\u9762\u7684\u547d\u4ee4\u884c\u53ef\u4ee5\u5982\u6b64\u6253\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">cm1 | cm2 | tee file | cm3<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5728\u9884\u8bbe\u4e0a\uff0ctee \u4f1a\u6539\u5199\u76ee\u6807\u6863\u6848\uff0c\u82e5\u4f60\u8981\u6539\u4e3a\u589e\u52a0\u5185\u5bb9\u7684\u8bdd\uff0c\u90a3\u53ef\u7528 -a \u53c2\u6570\u8fbe\u6210\u3002\u57fa\u672c\u4e0a\uff0cpipe line \u7684\u5e94\u7528\u5728 shell \u64cd\u4f5c\u4e0a\u662f\u975e\u5e38\u5e7f\u6cdb\u7684\uff0c\u5c24\u5176\u662f\u5728 text filtering \u65b9\u9762\uff0c\u51e1\u4e3e cat, more, head, tail, wc, expand, tr, grep, sed, awk,\u2026\u7b49\u7b49\u6587\u5b57\u5904\u7406\u5de5\u5177\uff0c\u642d\u914d\u8d77 pipe line \u6765\u4f7f\u7528\uff0c\u4f60\u4f1a\u60ca\u89c9 command line \u539f\u6765\u662f\u6d3b\u5f97\u5982\u6b64\u7cbe\u5f69\u7684\ufe57\u5e38\u8ba9\u4eba\u6709\u201c\u4f17\u91cc\u5bfb\u4ed6\u5343\u767e\u5ea6\uff0c\u84e6\u7136\u56de\u9996\uff0c\u90a3\u4eba\u5374\u5728\u706f\u706b\u9611\u73ca\u5904\ufe57\u201d\u4e4b\u611f\u3002\u597d\u4e86\uff0c\u5173\u4e8e I\/O Redirection \u7684\u4ecb\u7ecd\u5c31\u5230\u6b64\u544a\u4e00\u6bb5\u843d\u3002\u82e5\u65e5\u540e\u6709\u7a7a\u7684\u8bdd\uff0c\u518d\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u5176\u5b83\u5728 shell \u4e0a\u597d\u73a9\u7684\u4e1c\u897f\ufe57<\/p>\n<h1>12 \u4f60\u8981 if \u8fd8\u662f case \u5462\uff1f<\/h1>\n<p>\u8fd8\u8bb0\u5f97\u6211\u4eec\u5728\u7b2c 10 \u7ae0\u6240\u4ecb\u7ecd\u7684 return value \u5417\uff1f\u662f\u7684\uff0c\u63a5\u4e0b\u6765\u4ecb\u7ecd\u7684\u5185\u5bb9\u4e0e\u4e4b\u6709\u5173\uff0c\u82e5\u4f60\u7684\u8bb0\u5fc6\u4e5f\u88ab\u5047\u671f\u7684\u6b22\u4e50\u65f6\u5149\u6240\u62b5\u6d88\u6389\u7684\u8bdd\uff0c\u90a3\uff0c\u5efa\u8bae\u60a8\u8fd8\u662f\u5148\u56de\u53bb\u6e29\u4e60\u6e29\u4e60\u518d\u56de\u6765\u3002\u82e5\u4f60\u8bb0\u5f97\u00a0\u00a0return value \uff0c\u6211\u60f3\u4f60\u4e5f\u5e94\u8be5\u8bb0\u5f97\u4e86 &amp;&amp; \u4e0e || \u662f\u751a\u4e48\u610f\u601d\u5427\uff1f\u7528\u8fd9\u4e24\u4e2a\u7b26\u53f7\u518d\u914d\u642d command group \u7684\u8bdd\uff0c\u6211\u4eec\u53ef\u8ba9 shell script \u53d8\u5f97\u66f4\u52a0\u806a\u660e\u54e6\u3002\u6bd4\u65b9\u8bf4\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">comd1 &amp;&amp; {comd2<\/p>\n<p>comd3<\/p>\n<p>} || {<\/p>\n<p>comd4<\/p>\n<p>comd5<\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u610f\u601d\u662f\u8bf4\uff1a\u5047\u5982 comd1 \u7684 return value \u4e3a true \u7684\u8bdd\uff0c\u5219\u6267\u884c comd2 \u4e0e comd3 \uff0c\u5426\u5219\u6267\u884c comd4 \u4e0e comd5 \u3002<\/p>\n<p>\u4e8b\u5b9e\u4e0a\uff0c\u6211\u4eec\u5728\u5199 shell script \u7684\u65f6\u5019\uff0c\u7ecf\u5e38\u9700\u8981\u7528\u5230\u8fd9\u6837\u90a3\u6837\u7684\u6761\u4ef6\u4ee5\u4f5c\u51fa\u4e0d\u540c\u7684\u5904\u7406\u52a8\u4f5c\u3002\u7528 &amp;&amp; \u4e0e || \u7684\u786e\u53ef\u4ee5\u8fbe\u6210\u6761\u4ef6\u6267\u884c\u7684\u6548\u679c\uff0c\u7136\u800c\uff0c\u4ece\u201c\u4eba\u7c7b\u8bed\u8a00\u201d\u4e0a\u6765\u7406\u89e3\uff0c\u5374\u4e0d\u662f\u90a3\u4e48\u76f4\u89c2\u3002\u66f4\u591a\u65f6\u5019\uff0c\u6211\u4eec\u8fd8\u662f\u559c\u6b22\u7528 if\u2026then\u2026else\u2026\u8fd9\u6837\u7684 keyword \u6765\u8868\u8fbe\u6761\u4ef6\u6267\u884c\u3002\u5728 bash shell \u4e2d\uff0c\u6211\u4eec\u53ef\u4ee5\u5982\u6b64\u4fee\u6539\u4e0a\u4e00\u6bb5\u4ee3\u7801\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">if comd1then<\/p>\n<p>comd2<\/p>\n<p>comd3<\/p>\n<p>else<\/p>\n<p>comd4<\/p>\n<p>comd5<\/p>\n<p>fi<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u4e5f\u662f\u6211\u4eec\u5728 shell script \u4e2d\u6700\u5e38\u7528\u5230\u7684 if \u5224\u65ad\u5f0f\uff1a\u53ea\u8981 if \u540e\u9762\u7684 command line \u7684return value\u4e3atrue (\u6211\u4eec\u6700\u5e38\u7528 test \u547d\u4ee4\u6765\u9001\u51fa return value)\uff0c\u5219\u6267\u884c then \u540e\u9762\u7684\u547d\u4ee4\uff0c\u5426\u5219\u6267\u884c\u00a0\u00a0else \u540e\u7684\u547d\u4ee4\ufe54fi \u5219\u662f\u7528\u6765\u7ed3\u675f\u5224\u65ad\u5f0f\u7684 keyword \u3002\u5728 if \u5224\u65ad\u5f0f\u4e2d\uff0celse \u90e8\u4efd\u53ef\u4ee5\u4e0d\u7528\uff0c\u4f46 then \u662f\u5fc5\u9700\u7684\u3002<\/p>\n<p>(\u82e5 then \u540e\u4e0d\u60f3\u8dd1\u4efb\u4f55 command \uff0c\u53ef\u7528\u201c\uff1a\u201d\u8fd9\u4e2a null command \u4ee3\u66ff)\u3002<\/p>\n<p>\u5f53\u7136\uff0cthen \u6216 else \u540e\u9762\uff0c\u4e5f\u53ef\u4ee5\u518d\u4f7f\u7528\u66f4\u8fdb\u4e00\u5c42\u7684\u6761\u4ef6\u5224\u65ad\u5f0f\uff0c\u8fd9\u5728 shell script \u8bbe\u8ba1\u4e0a\u5f88\u5e38\u89c1\u3002\u82e5\u6709\u591a\u9879\u6761\u4ef6\u9700\u8981\u201c\u4f9d\u5e8f\u201d\u8fdb\u884c\u5224\u65ad\u7684\u8bdd\uff0c\u90a3\u6211\u4eec\u5219\u53ef\u4f7f\u7528 elif \u8fd9\u6837\u7684 keyword \uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">if comd1; thencomd2<\/p>\n<p>elif comd3; then<\/p>\n<p>comd4<\/p>\n<p>else<\/p>\n<p>comd5<\/p>\n<p>fi<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u610f\u601d\u662f\u8bf4\uff1a\u82e5 comd1 \u4e3a true \uff0c\u7136\u5219\u6267\u884c comd2 \uff1b\u5426\u5219\u518d\u6d4b\u8bd5 comd3 \uff0c\u7136\u5219\u6267\u884c comd4 \uff1b\u5018\u82e5 comd1 \u4e0e comd3 \u5747\u4e0d\u6210\u7acb\uff0c\u90a3\u5c31\u6267\u884c comd5 \u3002<\/p>\n<p>&nbsp;<\/p>\n<p>if \u5224\u65ad\u5f0f\u7684\u4f8b\u5b50\u5f88\u5e38\u89c1\uff0c\u4f60\u53ef\u4ece\u5f88\u591a shell script \u4e2d\u770b\u5f97\u5230\uff0c\u6211\u8fd9\u91cc\u5c31\u4e0d\u518d\u4e3e\u4f8b\u5b50\u4e86\u3002\u63a5\u4e0b\u6765\u8981\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u7684\u662f case \u5224\u65ad\u5f0f\u3002\u867d\u7136 if \u5224\u65ad\u5f0f\u5df2\u53ef\u5e94\u4ed8\u5927\u90e8\u4efd\u7684\u6761\u4ef6\u6267\u884c\u4e86\uff0c\u7136\u800c\uff0c\u5728\u67d0\u4e9b\u573a\u5408\u4e2d\uff0c\u5374\u4e0d\u591f\u7075\u6d3b\uff0c\u5c24\u5176\u662f\u5728 string \u5f0f\u6837\u7684\u5224\u65ad\u4e0a\uff0c\u6bd4\u65b9\u5982\u4e0b\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">QQ () {echo -n &#8220;Do you want to continue? (Yes\/No): &#8221;<\/p>\n<p>read YN<\/p>\n<p>if [ &#8220;$YN&#8221; = Y -o &#8220;$YN&#8221; = y -o &#8220;$YN&#8221; = &#8220;Yes&#8221; -o &#8220;$YN&#8221; = &#8220;yes&#8221; -o &#8220;$YN&#8221; = &#8220;YES&#8221; ]<\/p>\n<p>then<\/p>\n<p>QQ<\/p>\n<p>else<\/p>\n<p>exit 0<\/p>\n<p>fi<\/p>\n<p>}<\/p>\n<p>QQ<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4ece\u4f8b\u4e2d\uff0c\u6211\u4eec\u770b\u5f97\u51fa\u6765\uff0c\u6700\u9ebb\u70e6\u7684\u90e8\u4efd\u662f\u5728\u4e8e\u5224\u65ad YN \u7684\u503c\u53ef\u80fd\u6709\u597d\u51e0\u79cd\u5f0f\u6837\u3002\u806a\u660e\u7684\u4f60\u6216\u8bb8\u4f1a\u5982\u6b64\u4fee\u6539\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">&#8230;if echo &#8220;$YN&#8221; | grep -q &#8216;^[Yy]([Ee][Ss])*$&#8217;<\/p>\n<p>&#8230;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e5f\u5c31\u662f\u7528 Regular Expression \u6765\u7b80\u5316\u4ee3\u7801\u3002(\u6211\u4eec\u6709\u673a\u4f1a\u518d\u6765\u4ecb\u7ecd RE)\u53ea\u662f\u662f\u5426\u6709\u5176\u5b83\u66f4\u65b9\u4fbf\u7684\u65b9\u6cd5\u5462\uff1f\u6709\u7684\uff0c\u5c31\u662f\u7528 case \u5224\u65ad\u5f0f\u5373\u53ef\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">QQ () {echo -n &#8220;Do you want to continue? (Yes\/No): &#8221;<\/p>\n<p>read YN<\/p>\n<p>case &#8220;$YN&#8221; in<\/p>\n<p>[Yy]|[Yy][Ee][Ss])<\/p>\n<p>QQ<\/p>\n<p>;;<\/p>\n<p>*)<\/p>\n<p>exit 0<\/p>\n<p>;;<\/p>\n<p>esac<\/p>\n<p>}<\/p>\n<p>QQ<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6211\u4eec\u5e38 case \u7684\u5224\u65ad\u5f0f\u6765\u5224\u65ad\u67d0\u4e00\u53d8\u91cf\u5728\u4e0d\u540c\u7684\u503c(\u901a\u5e38\u662f string)\u65f6\u4f5c\u51fa\u4e0d\u540c\u7684\u5904\u7406\uff0c\u6bd4\u65b9\u8bf4\uff0c\u5224\u65ad script \u53c2\u6570\u4ee5\u6267\u884c\u4e0d\u540c\u7684\u547d\u4ee4\u3002\u82e5\u4f60\u6709\u5174\u8da3\u3001\u4e14\u7528 Linux \u7cfb\u7edf\u7684\u8bdd\uff0c\u4e0d\u59a8\u6316\u4e00\u6316 \/etc\/init.d\/* \u91cc\u90a3\u5806 script \u4e2d\u7684\u00a0\u00a0case \u7528\u6cd5\u3002\u5982\u4e0b\u5c31\u662f\u4e00\u4f8b\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">case &#8220;$1&#8243; instart)<\/p>\n<p>start<\/p>\n<p>;;<\/p>\n<p>stop)<\/p>\n<p>stop<\/p>\n<p>;;<\/p>\n<p>status)<\/p>\n<p>rhstatus<\/p>\n<p>;;<\/p>\n<p>restart|reload)<\/p>\n<p>restart<\/p>\n<p>;;<\/p>\n<p>condrestart)<\/p>\n<p>[ -f \/var\/lock\/subsys\/syslog ] &amp;&amp; restart || :<\/p>\n<p>;;<\/p>\n<p>*)<\/p>\n<p>echo $&#8221;Usage: $0 {start|stop|status|restart|condrestart}&#8221;<\/p>\n<p>exit 1<\/p>\n<p>esac<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(\u82e5\u4f60\u5bf9 positional parameter \u7684\u5370\u50cf\u5df2\u7ecf\u6a21\u7cca\u4e86\uff0c\u8bf7\u91cd\u770b\u7b2c 9 \u7ae0\u5427\u3002)<\/p>\n<h1>13 for what?\u00a0\u00a0while \u4e0e until \u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u7ec8\u4e8e\uff0c\u6765\u5230 shell \u5341\u4e09\u95ee\u7684\u6700\u540e\u4e00\u95ee\u4e86\uff0c\u957f\u957f\u5410\u4e00\u53e3\u6c14\u3002\u6700\u540e\u8981\u4ecb\u7ecd\u7684\u662f shell script \u8bbe\u8ba1\u4e2d\u5e38\u89c1\u7684\u201c\u5faa\u73af\u201d (loop)\u3002\u6240\u8c13\u7684 loop \u5c31\u662f script \u4e2d\u7684\u4e00\u6bb5\u5728\u4e00\u5b9a\u6761\u4ef6\u4e0b\u53cd\u590d\u6267\u884c\u7684\u4ee3\u7801\u3002bash shell\u00a0\u00a0\u4e2d\u5e38\u7528\u7684 loop \u6709\u5982\u4e0b\u4e09\u79cd\uff1a<\/p>\n<p>* for<\/p>\n<p>* while<\/p>\n<p>* until<\/p>\n<p>for loop \u662f\u4ece\u4e00\u4e2a\u6e05\u5355\u5217\u8868\u4e2d\u8bfb\u8fdb\u53d8\u91cf\u503c\uff0c\u5e76\u201c\u4f9d\u6b21\u201d\u7684\u5faa\u73af\u6267\u884c do \u5230 done \u4e4b\u95f4\u7684\u547d\u4ee4\u884c\u3002\u4f8b\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">for var in one two three four fivedo<\/p>\n<p>echo &#8212;&#8212;&#8212;&#8211;<\/p>\n<p>echo &#8216;$var is &#8216;$var<\/p>\n<p>echo<\/p>\n<p>done<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u5c06\u4f1a\u662f\uff1a<\/p>\n<p>1) for \u4f1a\u5b9a\u4e49\u4e00\u4e2a\u53eb var \u7684\u53d8\u91cf\uff0c\u5176\u503c\u4f9d\u6b21\u662f one two three four five \u3002<\/p>\n<p>2) \u56e0\u4e3a\u6709 5 \u4e2a\u53d8\u91cf\u503c\uff0c\u56e0\u6b64 do \u4e0e done \u4e4b\u95f4\u7684\u547d\u4ee4\u884c\u4f1a\u88ab\u5faa\u73af\u6267\u884c 5 \u6b21\u3002<\/p>\n<p>3) \u6bcf\u6b21\u5faa\u73af\u5747\u7528 echo \u4ea7\u751f\u4e09\u884c\u53e5\u5b50\u3002\u800c\u7b2c\u4e8c\u884c\u4e2d\u4e0d\u5728 hard quote \u4e4b\u5185\u7684 $var \u4f1a\u4f9d\u6b21\u88ab\u66ff\u6362\u4e3a one two three four five \u3002<\/p>\n<p>4) \u5f53\u6700\u540e\u4e00\u4e2a\u53d8\u91cf\u503c\u5904\u7406\u5b8c\u6bd5\uff0c\u5faa\u73af\u7ed3\u675f\u3002<\/p>\n<p>\u6211\u4eec\u4e0d\u96be\u770b\u51fa\uff0c\u5728\u00a0\u00a0for loop \u4e2d\uff0c\u53d8\u91cf\u503c\u7684\u591a\u5be1\uff0c\u51b3\u5b9a\u5faa\u73af\u7684\u6b21\u6570\u3002\u7136\u800c\uff0c\u53d8\u91cf\u5728\u5faa\u73af\u4e2d\u662f\u5426\u4f7f\u7528\u5219\u4e0d\u4e00\u5b9a\uff0c\u5f97\u89c6\u8bbe\u8ba1\u9700\u6c42\u800c\u5b9a\u3002\u5018\u82e5 for loop \u6ca1\u6709\u4f7f\u7528 in \u8fd9\u4e2a keyword \u6765\u6307\u5b9a\u53d8\u91cf\u503c\u6e05\u5355\u7684\u8bdd\uff0c\u5176\u503c\u5c06\u4ece $@ (\u6216 $* )\u4e2d\u7ee7\u627f\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">for var; do&#8230;.<\/p>\n<p>done<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>(\u82e5\u4f60\u5fd8\u8bb0\u4e86 positional parameter \uff0c\u8bf7\u6e29\u4e60\u7b2c 9 \u7ae0)<\/p>\n<p>for loop \u7528\u4e8e\u5904\u7406\u201c\u6e05\u5355\u201d (list)\u9879\u76ee\u975e\u5e38\u65b9\u4fbf\uff0c\u5176\u6e05\u5355\u9664\u4e86\u53ef\u660e\u786e\u6307\u5b9a\u6216\u4ece positional parameter \u53d6\u5f97\u4e4b\u5916\uff0c\u4e5f\u53ef\u4ece\u53d8\u91cf\u66ff\u6362\u6216\u547d\u4ee4\u66ff\u6362\u53d6\u5f97.(\u518d\u4e00\u6b21\u63d0\u9192\uff1a\u522b\u5fd8\u4e86\u547d\u4ee4\u884c\u7684\u201c\u91cd\u7ec4\u201d\u7279\u6027\ufe57)\u7136\u800c\uff0c\u5bf9\u4e8e\u4e00\u4e9b\u201c\u7d2f\u8ba1\u53d8\u5316\u201d\u7684\u9879\u76ee(\u5982\u6574\u6570\u52a0\u51cf)\uff0cfor \u4ea6\u80fd\u5904\u7406\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">for ((i=1;i&lt;=10;i++))do<\/p>\n<p>echo &#8220;num is $i&#8221;<\/p>\n<p>done<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u9664\u4e86 for loop \uff0c\u4e0a\u9762\u7684\u4f8b\u5b50\u6211\u4eec\u4e5f\u53ef\u6539\u7528\u00a0\u00a0while loop \u6765\u505a\u5230\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">num=1while [ &#8220;$num&#8221; -le 10 ]; do<\/p>\n<p>echo &#8220;num is $num&#8221;<\/p>\n<p>num=$(($num + 1))<\/p>\n<p>done<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>while loop \u7684\u539f\u7406\u4e0e for loop \u7a0d\u6709\u4e0d\u540c\uff1a\u5b83\u4e0d\u662f\u9010\u6b21\u5904\u7406\u6e05\u5355\u4e2d\u7684\u53d8\u91cf\u503c\uff0c\u800c\u662f\u53d6\u51b3\u4e8e while \u540e\u9762\u7684\u547d\u4ee4\u884c\u4e4b return value \uff1a<\/p>\n<p>* \u82e5ture \uff0c\u5219\u6267\u884c do \u4e0e done \u4e4b\u95f4\u7684\u547d\u4ee4\uff0c\u7136\u540e\u91cd\u65b0\u5224\u65ad while \u540e\u7684 return value<\/p>\n<p>* \u82e5false \uff0c\u5219\u4e0d\u518d\u6267\u884c do \u4e0e done \u4e4b\u95f4\u7684\u547d\u4ee4\u800c\u7ed3\u675f\u5faa\u73af<\/p>\n<p>\u5206\u6790\u4e0a\u4f8b\uff1a<\/p>\n<p>1) \u5728 while \u4e4b\u524d\uff0c\u5b9a\u4e49\u53d8\u91cf num=1<\/p>\n<p>2) \u7136\u540e\u6d4b\u8bd5(test) $num \u662f\u5426\u5c0f\u4e8e\u6216\u7b49\u4e8e 10<\/p>\n<p>3) \u7ed3\u679c\u4e3a true \uff0c\u4e8e\u662f\u6267\u884c echo \u5e76\u5c06 num \u7684\u503c\u52a0\u4e00<\/p>\n<p>4) \u518d\u4f5c\u7b2c\u4e8c\u8f6e\u6d4b\u8bd5\uff0c\u5176\u65f6 num \u7684\u503c\u4e3a 1+1=2 \uff0c\u4f9d\u7136\u5c0f\u4e8e\u6216\u7b49\u4e8e 10\uff0c\u56e0\u6b64\u4e3a\u00a0\u00a0true \uff0c\u7ee7\u7eed\u5faa\u73af<\/p>\n<p>5) \u76f4\u5230 num \u4e3a 10+1=11 \u65f6\uff0c\u6d4b\u8bd5\u624d\u4f1a\u5931\u8d25&#8230; \u4e8e\u662f\u7ed3\u675f\u5faa\u73af\u3002<\/p>\n<p>\u6211\u4eec\u4e0d\u96be\u53d1\u73b0\uff1a<\/p>\n<p>* \u82e5 while \u7684\u6d4b\u8bd5\u7ed3\u679c\u6c38\u8fdc\u4e3a true \u7684\u8bdd\uff0c\u90a3\u5faa\u73af\u5c06\u4e00\u76f4\u6c38\u4e45\u6267\u884c\u4e0b\u53bb\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">while :; doecho looping&#8230;<\/p>\n<p>done<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u4f8b\u7684\u201c:\u201d\u662f bash \u7684 null command \uff0c\u4e0d\u505a\u4efb\u4f55\u52a8\u4f5c\uff0c\u9664\u4e86\u9001\u56de true \u7684 return value \u3002\u56e0\u6b64\u8fd9\u4e2a\u5faa\u73af\u4e0d\u4f1a\u7ed3\u675f\uff0c\u79f0\u4f5c\u6b7b\u5faa\u73af\u3002\u6b7b\u5faa\u73af\u7684\u4ea7\u751f\u6709\u53ef\u80fd\u662f\u6545\u610f\u8bbe\u8ba1\u7684(\u5982\u8dd1 daemon)\uff0c\u4e5f\u53ef\u80fd\u662f\u8bbe\u8ba1\u9519\u8bef\u3002\u82e5\u8981\u7ed3\u675f\u6b7b\u5bfb\u73af\uff0c\u53ef\u900f\u8fc7 signal \u6765\u7ec8\u6b62(\u5982\u6309\u4e0b ctrl-c )\u3002<\/p>\n<p>(\u5173\u4e8e process \u4e0e signal \uff0c\u7b49\u65e5\u540e\u6709\u673a\u4f1a\u518d\u8865\u5145\uff0c\u5341\u4e09\u95ee\u6682\u65f6\u7565\u8fc7\u3002)<\/p>\n<p>\u4e00\u65e6\u4f60\u80fd\u591f\u7406\u89e3 while loop \u7684\u8bdd\uff0c\u90a3\u5c31\u80fd\u7406\u89e3 until loop \uff1a<\/p>\n<p>* \u4e0e while \u76f8\u53cd\uff0cuntil \u662f\u5728 return value \u4e3a false \u65f6\u8fdb\u5165\u5faa\u73af\uff0c\u5426\u5219\u7ed3\u675f<\/p>\n<p>\u56e0\u6b64\uff0c\u524d\u9762\u7684\u4f8b\u5b50\u6211\u4eec\u4e5f\u53ef\u4ee5\u8f7b\u677e\u7684\u7528\u00a0\u00a0until \u6765\u5199\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">num=1until [ ! &#8220;$num&#8221; -le 10 ]; do<\/p>\n<p>echo &#8220;num is $num&#8221;<\/p>\n<p>num=$(($num + 1))<\/p>\n<p>done<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6216\u662f\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"568\">num=1until [ &#8220;$num&#8221; -gt 10 ]; do<\/p>\n<p>echo &#8220;num is $num&#8221;<\/p>\n<p>num=$(($num + 1))<\/p>\n<p>done<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>okay \uff0c\u5173\u4e8e bash \u7684\u4e09\u4e2a\u5e38\u7528\u7684 loop \u6682\u65f6\u4ecb\u7ecd\u5230\u8fd9\u91cc\u3002\u5728\u7ed3\u675f\u672c\u7ae0\u4e4b\u524d\uff0c\u518d\u8ddf\u5927\u5bb6\u8865\u5145\u4e24\u4e2a\u4e0e loop \u6709\u5173\u7684\u547d\u4ee4\uff1a<\/p>\n<p>*\u00a0break<\/p>\n<p>* continue<\/p>\n<p>\u8fd9\u4e24\u4e2a\u547d\u4ee4\u5e38\u7528\u5728\u590d\u5408\u5f0f\u5faa\u73af\u91cc\uff0c\u4e5f\u5c31\u662f\u5728 do &#8230; done \u4e4b\u95f4\u53c8\u6709\u66f4\u8fdb\u4e00\u5c42\u7684 loop \uff0c\u5f53\u7136\uff0c\u7528\u5728\u5355\u4e00\u5faa\u73af\u4e2d\u4e5f\u672a\u5c1d\u4e0d\u53ef\u5566\u3002break \u662f\u7528\u6765\u6253\u65ad\u5faa\u73af\uff0c\u4e5f\u5c31\u662f\u201c\u5f3a\u8feb\u7ed3\u675f\u201d\u5faa\u73af\u3002\u82e5 break \u540e\u9762\u6307\u5b9a\u4e00\u4e2a\u6570\u503c n \u7684\u8bdd\uff0c\u5219\u201c\u4ece\u91cc\u5411\u5916\u201d\u6253\u65ad\u7b2c n \u4e2a\u5faa\u73af\uff0c\u9ed8\u8ba4\u503c\u4e3a break 1 \uff0c\u4e5f\u5c31\u662f\u6253\u65ad\u5f53\u524d\u7684\u5faa\u73af\u3002\u5728\u4f7f\u7528 break \u65f6\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c \u5b83\u4e0e return \u53ca exit \u662f\u4e0d\u540c\u7684\uff1a<\/p>\n<p>* break \u662f\u7ed3\u675f loop<\/p>\n<p>* return \u662f\u7ed3\u675f function<\/p>\n<p>* exit \u662f\u7ed3\u675f script\/shell<\/p>\n<p>\u800c continue \u5219\u4e0e break \u76f8\u53cd\uff1a\u5f3a\u8feb\u8fdb\u5165\u4e0b\u4e00\u6b21\u5faa\u73af\u52a8\u4f5c\u3002\u82e5\u4f60\u7406\u89e3\u4e0d\u6765\u7684\u8bdd\uff0c\u90a3\u4f60\u53ef\u7b80\u5355\u7684\u770b\u6210\uff1a\u5728 continue \u5230 done \u4e4b\u95f4\u7684\u53e5\u5b50\u7565\u8fc7\u800c\u8fd4\u56de\u5faa\u73af\u9876\u7aef\uff0c\u4e0e break \u76f8\u540c\u7684\u662f\uff1acontinue \u540e\u9762\u4e5f\u53ef\u6307\u5b9a\u4e00\u4e2a\u6570\u503c n \uff0c\u4ee5\u51b3\u5b9a\u7ee7\u7eed\u54ea\u4e00\u5c42(\u4ece\u91cc\u5411\u5916\u8ba1\u7b97)\u7684\u5faa\u73af\uff0c\u9ed8\u8ba4\u503c\u4e3a continue 1 \uff0c\u4e5f\u5c31\u662f\u7ee7\u7eed\u5f53\u524d\u7684\u5faa\u73af\u3002\u5728 shell script \u8bbe\u8ba1\u4e2d\uff0c\u82e5\u80fd\u5584\u7528 loop \uff0c\u5c06\u80fd\u5927\u5e45\u5ea6\u63d0\u9ad8 script \u5728\u590d\u6742\u6761\u4ef6\u4e0b\u7684\u5904\u7406\u80fd\u529b\u3002\u8bf7\u591a\u52a0\u7ec3\u4e60\u5427\u3002<\/p>\n<h1>14 [^ ] \u8ddf [! ] \u5dee\u5728\u54ea\uff1f<\/h1>\n<p>\u8fd9\u4e2a\u95ee\u9898\u7b49\u4e86\u597d\u4e45\u90fd\u6ca1\u4eba\u51fa\u6765\u8865\u5145, \u800c\u6211\u5462, \u4e5f\u88ab\u8ffd\u6740\u4e86\u597d\u51e0\u56de\u3002\u8fd9\u9053\u9898\u76ee\u8bf4\u7a7f\u4e86, \u5c31\u662f\u8981\u63a2\u8ba8 Wildcard \u4e0e Regular Expression \u7684\u5dee\u522b\u7684\u3002\u8fd9\u4e5f\u662f\u8bb8\u591a\u521d\u5b66 shell \u7684\u670b\u53cb\u5f88\u5bb9\u6613\u6df7\u4e71\u7684\u5730\u65b9\u3002\u9996\u5148, \u8ba9\u6211\u4eec\u56de\u5230\u5341\u4e09\u95ee\u4e4b\u7b2c 2 \u95ee, \u518d\u4e00\u6b21\u5c06\u6211\u4eec\u63d0\u5230\u7684 command line format \u6e29\u4e60\u4e00\u6b21\uff1a<\/p>\n<p>command_name options arguments<\/p>\n<p>\u540c\u65f6, \u4e5f\u518d\u6765\u7406\u89e3\u4e00\u4e0b\u6211\u5728\u7b2c 5 \u95ee\u6240\u63d0\u5230\u7684\u53d8\u91cf\u66ff\u6362\u7684\u7279\u6027\uff1a<\/p>\n<p>\u5148\u66ff\u6362, \u518d\u91cd\u7ec4 command lline!<\/p>\n<p>\u6709\u4e86\u8fd9\u4e24\u9053\u57fa\u7840\u540e, \u624d\u8ba9\u6211\u4eec\u6765\u770b\u770b wildcard \u662f\u751a\u4e48\u56de\u4e8b\u5427.\u3002<\/p>\n<p>Part-I: Wildcard\uff1a<\/p>\n<p>\u9996\u5148, wildcard \u4e5f\u662f\u5c5e\u4e8e command line \u7684\u5904\u7406\u5de5\u5e8f, \u4f5c\u7528\u4e8e argument \u91cc\u7684 path \u4e4b\u4e0a.\u6ca1\u9519, \u5b83\u4e0d\u7528\u5728 command_name \u4e5f\u4e0d\u7528\u5728 options \u4e0a.\u800c\u4e14, \u82e5 argument \u4e0d\u662f path \u7684\u8bdd, \u90a3\u4e5f\u4e0e wildcard \u65e0\u5173.\u6362\u53e5\u66f4\u4e3a\u7cbe\u786e\u7684\u5b9a\u4e49\u6765\u8bb2, wildcard \u662f\u4e00\u79cd\u547d\u4ee4\u884c\u7684\u8def\u5f84\u6269\u5c55(path expansion)\u529f\u80fd.\u63d0\u5230\u8fd9\u4e2a\u6269\u5c55, \u90a3\u5c31\u4e0d\u8981\u5fd8\u8bb0\u4e86 command line \u7684\u201c\u91cd\u7ec4\u201d\u7279\u6027\u4e86!\u662f\u7684, \u8fd9\u4e0e\u53d8\u91cf\u66ff\u6362(variable substitution)\u53ca\u547d\u4ee4\u66ff\u6362(command substitution)\u7684\u91cd\u7ec4\u7279\u6027\u662f\u4e00\u6837\u7684!\u4e5f\u5c31\u662f\u5728 wildcard \u8fdb\u884c\u6269\u5c55\u540e, \u547d\u4ee4\u884c\u4f1a\u5148\u5b8c\u6210\u91cd\u7ec4\u624d\u4f1a\u4ea4\u7ed9 shell \u6765\u5904\u7406.\u4e86\u89e3\u4e86 wildcard \u7684\u6269\u5c55\u4e0e\u91cd\u7ec4\u7279\u6027\u540e, \u63a5\u4e0b\u6765, \u8ba9\u6211\u4eec\u4e86\u89e3\u4e00\u4e9b\u5e38\u89c1\u7684 wildcard \u5427\uff1a<\/p>\n<p>*\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5339\u914d 0 \u6216\u591a\u4e2a\u5b57\u7b26<\/p>\n<p>?\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5339\u914d\u4efb\u610f\u5355\u4e00\u5b57\u7b26<\/p>\n<p>[list]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5339\u914d list \u4e2d\u7684\u4efb\u610f\u5355\u4e00\u5b57\u7b26(\u6ce8\u4e00)<\/p>\n<p>[!list]\u00a0\u00a0\u00a0\u00a0\u00a0 \u5339\u914d\u4e0d\u5728 list \u4e2d\u7684\u4efb\u610f\u5355\u4e00\u5b57\u7b26<\/p>\n<p>{string1,string2,&#8230;}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5339\u914d sring1 \u6216 string2 (\u6216\u66f4\u591a)\u5176\u4e00\u5b57\u7b26\u4e32<\/p>\n<p>(\u6ce8\u4e00: list \u53ef\u4ee5\u4e3a\u6307\u5b9a\u7684\u4e2a\u522b\u5b57\u7b26, \u5982 abcd; \u4e5f\u53ef\u4ee5\u4e3a\u4e00\u6bb5 ASCII \u5b57\u7b26\u7684\u8d77\u6b62\u8303\u56f4, \u5982: a-d .)<br \/>\n\u4f8b:<\/p>\n<p>a*b\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a \u4e0e b \u4e4b\u95f4\u53ef\u4ee5\u6709\u4efb\u610f\u957f\u5ea6\u7684\u4efb\u610f\u5b57\u7b26, \u4e5f\u53ef\u4ee5\u4e00\u4e2a\u4e5f\u6ca1\u6709, \u5982: aabcb, axyzb, a012b, ab \u7b49<\/p>\n<p>a?b\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a \u4e0e b \u4e4b\u95f4\u5fc5\u987b\u4e5f\u53ea\u80fd\u6709\u4e00\u4e2a\u5b57\u7b26, \u53ef\u4ee5\u662f\u4efb\u610f\u5b57\u7b26, \u5982: aab, abb, acb, a0b \u7b49<\/p>\n<p>a[xyz]b\u00a0\u00a0 a \u4e0e b \u4e4b\u95f4\u5fc5\u987b\u4e5f\u53ea\u80fd\u6709\u4e00\u4e2a\u5b57\u7b26, \u4f46\u53ea\u80fd\u662f x \u6216 y \u6216 z, \u5982: axb, ayb, azb \u8fd9\u4e09\u4e2a<\/p>\n<p>a[!0-9]b\u00a0 a \u4e0e b \u4e4b\u95f4\u5fc5\u987b\u4e5f\u53ea\u80fd\u6709\u4e00\u4e2a\u5b57\u7b26, \u4f46\u4e0d\u80fd\u662f\u963f\u62c9\u4f2f\u6570\u5b57, \u5982: axb, aab, a-b \u7b49<\/p>\n<p>a{abc,xyz,123}b\u00a0\u00a0\u00a0 a \u4e0e b \u4e4b\u95f4\u53ea\u80fd\u662f abc \u6216 xyz \u6216 123 \u8fd9\u4e09\u4e2a\u5b57\u7b26\u4e32\u4e4b\u4e00, \u5982 aabcb, axyzb, a123b \u8fd9\u4e09\u4e2a.<\/p>\n<p>\u6ce8\u610f\uff1a<\/p>\n<p>1) [! ] \u4e2d\u7684 ! \u53ea\u6709\u653e\u5728\u7b2c\u4e00\u987a\u4f4d\u65f6, \u624d\u6709\u6392\u9664\u4e4b\u529f. \u4e3e\u4f8b\u8bf4:<\/p>\n<p>[!a]* \u00a0\u00a0\u00a0\u00a0 \u8868\u793a\u5f53\u524d\u76ee\u5f55\u4e0b\u6240\u6709\u4e0d\u4ee5 a \u5f00\u9996\u7684\u8def\u5f84\u540d\u79f0<\/p>\n<p>\/tmp\/[a!]* \u00a0\u00a0\u00a0 \u8868\u793a \/tmp \u76ee\u5f55\u4e0b\u4ee5 a \u6216 ! \u5f00\u9996\u7684\u8def\u5f84\u540d\u79f0. (\u601d\u8003: \u4e3a\u4f55 ! \u524d\u9762\u8981\u52a0  \u5462? \u63d0\u793a: \u5341\u4e09\u95ee\u4e4b 4 )<\/p>\n<p>2) [ -] \u4e2d\u7684 &#8211; \u5de6\u53f3\u4e24\u8fb9\u5747\u6709\u5b57\u7b26\u65f6, \u624d\u8868\u793a\u4e00\u6bb5\u8303\u56f4, \u5426\u5219\u4ec5\u4f5c\u201c\uff0d\u201d (\u51cf\u53f7) \u5b57\u7b26\u6765\u5904\u7406. \u4e3e\u4f8b\u8bf4\uff1a<\/p>\n<p>\/tmp\/*[-z]\/[a-zA-Z]*\u00a0\u00a0\u00a0\u00a0 \u8868\u793a \/tmp \u76ee\u5f55\u4e0b\u6240\u6709\u4ee5 z \u6216 &#8211; \u7ed3\u5c3e\u7684\u5b50\u76ee\u5f55\u4e0b\u4ee5\u82f1\u6587\u5b57\u6bcd(\u4e0d\u5206\u5927\u5c0f\u5199)\u5f00\u9996\u7684\u8def\u5f84\u540d\u79f0<\/p>\n<p>3) \u4ee5 * \u6216 ? \u5f00\u9996\u7684 wildcard \u4e0d\u80fd\u5339\u914d\u9690\u85cf\u6587\u4ef6(\u5373\u4ee5 . \u5f00\u9996\u7684\u6587\u4ef6). \u4e3e\u4f8b\u8bf4\uff1a<\/p>\n<p>*.txt\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u5e76\u4e0d\u80fd\u5339\u914d .txt \u4f46\u53ef\u5339\u914d 1.txt \u8fd9\u6837\u7684\u8def\u5f84\u540d\u79f0\uff0c\u4f46 1*txt \u53ca 1?txt \u5747\u53ef\u5339\u914d 1.txt \u8fd9\u6837\u7684\u8def\u5f84\u540d\u79f0\u3002<\/p>\n<p>\u57fa\u672c\u4e0a, \u8981\u638c\u63e1 wildcard \u5e76\u4e0d\u96be, \u53ea\u8981\u591a\u52a0\u7ec3\u4e60, \u518d\u52e4\u4e8e\u601d\u8003, \u5c31\u80fd\u719f\u52a0\u8fd0\u7528\u4e86.\u518d\u6b21\u63d0\u9192: \u522b\u5fd8\u4e86\u201c\u6269\u5145+\u91cd\u7ec4\u201d\u8fd9\u4e2a\u91cd\u8981\u7279\u6027, \u800c\u4e14\u53ea\u4f5c\u7528\u5728 argument \u7684 path \u4e0a.\u6bd4\u65b9\u8bf4, \u5047\u8bbe\u5f53\u524d\u76ee\u5f55\u4e0b\u6709 a.txt b.txt c.txt 1.txt 2.txt 3.txt \u8fd9\u51e0\u4efd\u6587\u4ef6.\u5f53\u6211\u4eec\u5728\u547d\u4ee4\u884c\u4e2d\u4e0b\u8fbe ls -l [0-9].txt \u7684\u547d\u4ee4\u884c\u65f6, \u56e0\u4e3a wildcard \u5904\u4e8e argument \u7684\u4f4d\u7f6e\u4e0a, \u4e8e\u662f\u6839\u636e\u5176\u5339\u914d\u7684\u8def\u5f84, \u6269\u5c55\u4e3a 1.txt 2.txt 3.txt ,\u518d\u91cd\u7ec4\u51fa ls -l 1.txt 2.txt 3.txt \u8fd9\u6837\u7684\u547d\u4ee4\u884c.\u56e0\u6b64, \u4f60\u5728\u547d\u4ee4\u884c\u4e0a\u6572 ls -l [0-9].txt \u4e0e ls -l 1.txt 2.txt 3.txt \u90fd\u662f\u540c\u6837\u7684\u7ed3\u679c, \u5176\u539f\u56e0\u6b63\u662f\u4e8e\u6b64\u4e86&#8230; \ud83d\ude42<\/p>\n<p>&nbsp;<\/p>\n<p>Part-II: Regular Expression<\/p>\n<p>\u63a5\u4e0b\u6765\u7684 Regular Expression(RE) \u53ef\u662f\u4e2a\u5927\u9898\u76ee, \u8981\u8bb2\u7684\u5f88\u591a, \u6211\u8fd9\u91cc\u5f53\u7136\u4e0d\u53ef\u80fd\u8bb2\u5f97\u5f88\u5b8c\u5168.\u53ea\u5e0c\u671b\u5e26\u7ed9\u5927\u5bb6\u4e00\u4e2a\u57fa\u672c\u7684\u5165\u95e8\u6982\u5ff5, \u5c31\u5f88\u662f\u8db3\u591f\u4e86\u3002\u5148\u6765\u8003\u4e00\u4e0b\u82f1\u6587\u597d\u4e86: What is expression?\u7b80\u5355\u6765\u8bf4, \u5c31\u662f\u201c\u8868\u8fbe\u201d, \u4e5f\u5c31\u662f\u4eba\u4eec\u5728\u6c9f\u901a\u65f6\u6240\u8981\u9648\u8ff0\u7684\u5185\u5bb9.\u7136\u800c, \u751f\u6d3b\u4e2d, \u8868\u8fbe\u65b9\u8981\u6e05\u695a\u7684\u5c06\u610f\u601d\u63cf\u8ff0\u6e05\u695a\u800c\u8ba9\u63a5\u6536\u65b9\u5b8c\u6574\u4e14\u65e0\u8bef\u7684\u9886\u4f1a, \u53ef\u4e0d\u662f\u4ef6\u5bb9\u6613\u7684\u4e8b\u60c5.\u56e0\u800c\u624d\u4f1a\u51fa\u73b0\u90a3\u4e48\u591a\u7684\u201c\u8bef\u4f1a\u201d, \u771f\u53ef\u53f9\u53e5\u201c\u8868\u8fbe\u4e0d\u6613\u201d\u554a\u3002\u540c\u6837\u7684\u60c5\u5f62\u4e5f\u53d1\u751f\u5728\u8ba1\u7b97\u673a\u7684\u6570\u636e\u5904\u7406\u8fc7\u7a0b\u4e2d, \u5c24\u5176\u662f\u5f53\u6211\u4eec\u5728\u63cf\u672f\u4e00\u6bb5\u201c\u6587\u5b57\u5185\u5bb9\u201d\u7684\u65f6\u5019\u3002\u90a3\u4e48, \u6211\u4eec\u4e0d\u7981\u8981\u95ee: \u6709\u4f55\u65b9\u6cd5\u53ef\u4ee5\u8ba9\u5927\u5bb6\u7684\u8bef\u4f1a\u964d\u81f3\u6700\u4f4e\u7a0b\u5ea6\u800c\u8ba9\u8868\u8fbe\u7684\u7cbe\u786e\u5ea6\u8fbe\u5230\u6700\u9ad8\u7a0b\u5ea6\u5462?\u7b54\u6848\u5c31\u662f\u201c\u6807\u51c6\u5316\u201d\u4e86, \u4ea6\u5c31\u662f\u6211\u4eec\u8fd9\u91cc\u8981\u8c08\u7684 Regular Expression \u5566\u3002<\/p>\n<p>\u7136\u800c, \u5728\u8fdb\u5165 RE \u4ecb\u7ecd\u4e4b\u524d, \u4e0d\u9632\u5148\u8ba9\u6211\u4eec\u6e29\u4e60\u4e00\u4e0b shell \u5341\u4e09\u95ee\u7b2c 4 \u95ee, \u4e5f\u5c31\u662f\u5173\u4e8e quoting \u7684\u90e8\u4efd.\u5173\u952e\u662f\u8981\u80fd\u591f\u533a\u5206 shell command line \u4e0a\u7684 meta \u4e0e literal \u8fd9\u4e24\u79cd\u4e0d\u540c\u7684\u5b57\u7b26\u7c7b\u522b.\u7136\u540e, \u6211\u8fd9\u91cc\u624d\u8ddf\u4f60\u8bb2\uff1aRE \u8868\u8fbe\u5f0f\u91cc\u7684\u5b57\u7b26\u4e5f\u662f\u5206\u4e3a meta \u4e0e literal \u8fd9\u4e24\u79cd!<br \/>\n\u5475, \u4e0d\u77e5\u4eb2\u7231\u7684\u8bfb\u8005\u662f\u5426\u88ab\u6211\u641e\u6df7\u4e71\u4e86\u5462?\u8fd9\u4e5f\u96be\u602a\u5566, \u56e0\u4e3a\u8fd9\u7684\u786e\u662f\u6700\u5bb9\u6613\u6df7\u4e71\u7684\u5730\u65b9, \u521a\u5b66 RE \u7684\u670b\u53cb\u5f88\u591a\u65f6\u5019\u90fd\u6b7b\u5728\u8fd9\u91cc!\u56e0\u6b64\u8bf7\u7279\u522b\u5c0f\u5fc3\u7406\u89e3\u54e6\u3002<\/p>\n<p>\u7b80\u5355\u800c\u8a00, \u9664\u975e\u4f60\u5c06 RE \u5199\u5728\u7279\u5b9a\u7a0b\u5e8f\u4f7f\u7528\u7684\u811a\u672c\u91cc,\u5426\u5219, \u6211\u4eec\u7684 RE \u4e5f\u662f\u900f\u8fc7 command line \u8f93\u5165\u7684.\u7136\u800c, \u4e0d\u5c11 RE \u6240\u59cb\u7528\u7684 meta \u5b57\u7b26, \u8ddf shell meta \u5b57\u7b26\u662f\u51b2\u7a81\u7684.\u6bd4\u65b9\u8bf4, * \u8fd9\u4e2a\u5b57\u7b26, \u5728 RE \u91cc\u662f\u4e00\u4e2a modifier(\u540e\u8ff0), \u5728 command line \u4e0a, \u5374\u662f\u4e2a wildcard !\u90a3\u4e48, \u6211\u4eec\u8be5\u5982\u4f55\u89e3\u51b3\u8fd9\u6837\u7684\u51b2\u7a81\u5462? \u5173\u952e\u5c31\u662f\u770b\u4f60\u5bf9\u5341\u4e09\u95ee\u7b2c 4 \u95ee\u6240\u63d0\u7684 quoting \u662f\u5426\u591f\u7406\u89e3\u4e86!\u82e5\u4f60\u660e\u767d\u5230 shell quoting \u5c31\u662f\u5728 command line \u4e0a\u5173\u95ed shell meta \u8fd9\u4e00\u57fa\u672c\u539f\u7406,\u90a3\u4f60\u5c31\u80fd\u5f88\u8f7b\u677e\u7684\u89e3\u51b3 RE meta \u4e0e shell meta \u7684\u51b2\u7a81\u95ee\u9898\u4e86:\u7528 shell quoting \u5173\u6389 shell meta \u5c31\u662f\u4e86!\u5c31\u8fd9\u4e48\u7b80\u5355\u3002\u518d\u4ee5\u521a\u63d0\u5230\u7684 * \u5b57\u7b26\u4e3a\u4f8b, \u82e5\u5728 command line \u4e2d\u6ca1\u6709 quoting \u5904\u7406\u7684\u8bdd, \u5982 abc* , \u90a3\u5c31\u4f1a\u88ab\u4f5c\u4e3a wildcard expansion \u6765\u6269\u5145\u53ca\u91cd\u7ec4\u4e86.\u82e5\u5c06\u4e4b\u7f6e\u4e8e quoting \u4e2d, \u5982 &#8220;abc*&#8221;, \u5219\u53ef\u907f\u514d wildcard expansion \u7684\u5904\u7406.<\/p>\n<p>\u597d\u4e86, \u8bf4\u4e86\u5927\u534a\u5929, \u8fd8\u6ca1\u8fdb\u5165\u6b63\u5f0f\u7684 RE \u4ecb\u7ecd\u5462\u3002\u5927\u5bb6\u522b\u6025, \u56e0\u4e3a\u6211\u7684\u6559\u5b66\u98ce\u683c\u5c31\u662f\u8981\u5148\u5efa\u7acb\u57fa\u7840, \u5faa\u5e8f\u6e10\u8fdb\u7684\u3002\u56e0\u6b64, \u6211\u8fd9\u91cc\u8fd8\u8981\u5728\u5570\u5506\u4e00\u4e2a\u89c2\u5ff5, \u624d\u4f1a\u5230 RE \u7684\u8bf4\u660e\u5566\u3002\u5f53\u6211\u4eec\u5728\u8c08\u5230 RE \u65f6, \u5343\u4e07\u522b\u8ddf wildcard \u641e\u6df7\u5728\u4e00\u8d77!\u5c24\u5176\u5728 command line \u7684\u4f4d\u7f6e\u91cc, wildcard \u53ea\u4f5c\u7528\u4e8e argument \u7684 path \u4e0a.\u4f46\u662f RE \u5374\u53ea\u7528\u4e8e\u201c\u5b57\u7b26\u4e32\u5904\u7406\u201d\u7684\u7a0b\u5e8f\u4e4b\u4e2d, \u8fd9\u4e0e\u8def\u5f84\u540d\u79f0\u4e00\u70b9\u5173\u7cfb\u4e5f\u6ca1\u6709!RE \u6240\u5904\u7406\u7684\u5b57\u7b26\u4e32\u901a\u5e38\u662f\u6307\u7eaf\u6587\u6863\u6216\u900f\u8fc7 stdin \u8bfb\u8fdb\u7684\u5185\u5bb9\u3002okay, \u591f\u4e86\u591f\u4e86, \u6211\u5df2\u770b\u5230\u4e00\u5806\u4eba\u5f00\u59cb\u51fa\u73b0\u4e0d\u5927\u8010\u70e6\u7684\u6837\u5b50\u4e86\u3002\u73b0\u5728, \u5c31\u8ba9\u6211\u95e8\u767b\u5802\u5165\u5ba4, \u64a9\u5f00 RE \u7684\u795e\u79d8\u9762\u7eb1\u5427, \u8fd9\u6837\u53ef\u4ee5\u653e\u8fc7\u6211\u4e86\u5427?<\/p>\n<p>\u5728 RE \u7684\u8868\u8fbe\u5f0f\u91cc, \u4e3b\u8981\u5206\u4e24\u79cd\u5b57\u7b26(character): literal \u4e0e meta.\u6240\u8c13 literal \u5c31\u662f\u5728 RE \u91cc\u4e0d\u5177\u7279\u6b8a\u529f\u80fd\u7684\u5b57\u7b26, \u5982 abc, 123 \u8fd9\u4e9b;\u800c meta \u5728 RE \u91cc\u5177\u6709\u7279\u6b8a\u7684\u529f\u80fd, \u8981\u5173\u95ed\u4e4b\u9700\u5728 meta \u524d\u9762\u4f7f\u7528 escape(  )\u5b57\u7b26.\u7136\u800c, \u5728\u4ecb\u7ecd meta \u4e4b\u524d, \u5148\u8ba9\u6211\u4eec\u6765\u8ba4\u8bc6\u4e00\u4e0b\u5b57\u7b26\u7ec4\u5408(character set)\u4f1a\u66f4\u597d\u4e9b.<\/p>\n<p>\u6240\u8c13\u7684 char. set \u5c31\u662f\u5c06\u591a\u4e2a\u8fde\u7eed\u7684\u5b57\u7b26\u4f5c\u4e00\u4e2a\u96c6\u5408, \u6bd4\u65b9\u8bf4\uff1a<\/p>\n<p>abc\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u8868\u793a abc \u4e09\u4e2a\u8fde\u7eed\u7684\u5b57\u7b26, \u4f46\u5f7c\u6b64\u72ec\u7acb\u800c\u975e\u96c6\u5408. (\u53ef\u7b80\u5355\u89c6\u4e3a\u4e09\u4e2a char. set)<\/p>\n<p>(abc)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u8868\u793a abc \u8fd9\u4e09\u4e2a\u8fde\u7eed\u5b57\u7b26\u7684\u96c6\u5408. (\u53ef\u7b80\u5355\u89c6\u4e3a\u4e00\u4e2a char. set)<\/p>\n<p>abc|xyz\u00a0\u00a0\u00a0 \u8868\u793a\u6216 abc \u6216 xyz \u8fd9\u4e24\u4e2a char. set \u4e4b\u4e00<\/p>\n<p>[abc]\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u8868\u793a\u5355\u4e00\u5b57\u7b26, \u53ef\u4e3a a \u6216 b \u6216 c . (\u4e0e wildcard \u4e4b [abc] \u539f\u7406\u76f8\u540c)<\/p>\n<p>[^abc]\u00a0\u00a0\u00a0\u00a0 \u8868\u793a\u5355\u4e00\u5b57\u7b26, \u4e0d\u4e3a a \u6216 b \u6216 c \u5373\u53ef. (\u4e0e wildcard \u4e4b [!abc] \u539f\u7406\u76f8\u540c)<\/p>\n<p>.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u8868\u793a\u4efb\u610f\u5355\u4e00\u5b57\u7b26. (\u4e0e wildcard \u4e4b ? \u539f\u7406\u76f8\u540c)<\/p>\n<p>\u5728\u8ba4\u8bc6\u4e86 char. set \u8fd9\u4e2a\u6982\u5ff5\u540e, \u7136\u540e\u518d\u8ba9\u6211\u4eec\u591a\u8ba4\u8bc6\u51e0\u4e2a RE \u4e2d\u5e38\u89c1\u7684 meta \u5b57\u7b26\uff1a<\/p>\n<p>\u951a\u70b9(anchor)\uff1a\u7528\u4ee5\u6807\u8bc6 RE \u4e8e\u53e5\u5b50\u4e2d\u7684\u4f4d\u7f6e\u6240\u5728. \u5e38\u89c1\u6709:<\/p>\n<p>^ \u00a0\u00a0\u00a0 \u8868\u793a\u53e5\u9996. \u5982 ^abc \u8868\u793a\u4ee5 abc \u5f00\u9996\u7684\u53e5\u5b50<\/p>\n<p>$ \u00a0\u00a0\u00a0 \u8868\u793a\u53e5\u5c3e. \u5982 abc$ \u8868\u793a\u4ee5 abc \u7ed3\u5c3e\u7684\u53e5\u5b50<\/p>\n<p>&lt; \u00a0 \u8868\u793a\u8bcd\u9996. \u5982 &lt;abc \u8868\u793a\u4ee5 abc \u5f00\u9996\u7684\u8bcd<\/p>\n<p>&gt; \u00a0 \u8868\u793a\u8bcd\u5c3e. \u5982 abc&gt; \u8868\u793a\u4ee5 abc \u7ed3\u5c3e\u7684\u8bcd<\/p>\n<p>\u4fee\u9970\u5b57\u7b26(modifier)\uff1a\u72ec\u7acb\u8868\u793a\u65f6\u672c\u8eab\u4e0d\u5177\u610f\u4e49, \u4e13\u95e8\u7528\u4ee5\u4fee\u6539\u524d\u4e00\u4e2a char. set \u7684\u51fa\u73b0\u6b21\u6570. \u5e38\u89c1\u6709\uff1a<\/p>\n<p>*\u00a0\u00a0\u00a0\u00a0 \u8868\u793a\u524d\u4e00\u4e2a char. set \u7684\u51fa\u73b0\u6b21\u6570\u4e3a 0 \u6216\u591a\u6b21. \u5982 ab*c \u8868\u793a a \u4e0e c \u4e4b\u95f4\u53ef\u6709 0 \u6216\u591a\u4e2a b \u5b58\u5728<\/p>\n<p>?\u00a0\u00a0\u00a0\u00a0\u00a0 \u8868\u793a\u524d\u4e00\u4e2a char. set \u7684\u51fa\u73b0\u6b21\u6570\u4e3a 0 \u6216 1 \u6b21. \u5982 ab?c \u8868\u793a a \u4e0e c \u4e4b\u95f4\u53ef\u6709 0 \u6216 1 \u4e2a b \u5b58\u5728<\/p>\n<p>+\u00a0\u00a0\u00a0\u00a0 \u8868\u793a\u524d\u4e00\u4e2a char. set \u7684\u51fa\u73b0\u6b21\u6570\u4e3a 1 \u6216\u591a\u6b21. \u5982 ab+c \u8868\u793a a \u4e0e c \u4e4b\u95f4\u53ef\u6709 1 \u6216\u591a\u4e2a b \u5b58\u5728<\/p>\n<p>{n} \u8868\u793a\u524d\u4e00\u4e2a char. set \u7684\u51fa\u73b0\u6b21\u6570\u5fc5\u987b\u4e3a n \u6b21. \u5982 ab{3,}c \u8868\u793a a \u4e0e c \u4e4b\u95f4\u5fc5\u987b\u6709 3 \u4e2a b \u5b58\u5728.{n,}: \u8868\u793a\u524d\u4e00\u4e2a char. set \u7684\u51fa\u73b0\u6b21\u6570\u81f3\u5c11\u4e3a n \u6b21. \u5982 ab{3,}c \u8868\u793a a \u4e0e c \u4e4b\u95f4\u81f3\u5c11\u6709 3 \u4e2a b \u5b58\u5728<\/p>\n<p>{n,m} \u00a0\u00a0 \u8868\u793a\u524d\u4e00\u4e2a char. set \u7684\u51fa\u73b0\u6b21\u6570\u4e3a n \u5230 m \u6b21. \u5982 ab{3,5}c \u8868\u793a a \u4e0e c \u4e4b\u95f4\u6709 3 \u5230 5 \u4e2a b \u5b58\u5728<\/p>\n<p>\u7136\u800c, \u5f53\u6211\u4eec\u5728\u8bc6\u522b modifier \u65f6, \u5374\u5f88\u5bb9\u6613\u5ffd\u7565\u201c\u8fb9\u754c(boundary)\u201d\u5b57\u7b26\u7684\u91cd\u8981\u6027.\u4ee5\u521a\u63d0\u5230\u7684 ab{3,5}c \u4e3a\u4f8b, \u8fd9\u91cc\u7684 a \u4e0e c \u5c31\u662f\u8fb9\u754c\u5b57\u7b26\u4e86.\u82e5\u6ca1\u6709\u8fb9\u754c\u5b57\u7b26\u7684\u5e2e\u5fd9, \u6211\u4eec\u5f88\u5bb9\u4ee5\u4f5c\u51fa\u9519\u8bef\u7684\u89e3\u8bfb.\u6bd4\u65b9\u8bf4: \u6211\u4eec\u7528 ab{3,5} \u8fd9\u4e2a RE (\u5c11\u4e86 c \u8fd9\u4e2a\u8fb9\u754c\u5b57\u7b26)\u53ef\u4ee5\u6293\u5230 abbbbbbbbbbc (a \u540e\u6709 10 \u4e2a b )\u8fd9\u4e32\u5b57\u5417?\u4ece\u521a\u624d\u7684 modifier \u6211\u4eec\u4e00\u822c\u4f1a\u8ba4\u4e3a\u6211\u4eec\u8981\u7684 b \u662f 3 \u5230 5 \u4e2a, \u82e5\u8d85\u51fa\u4e86\u6b64\u8303\u56f4, \u5c31\u4e0d\u662f\u6211\u4eec\u8981\u8868\u8fbe\u7684.\u56e0\u6b64, \u6211\u4eec\u6216\u4f1a\u5f88\u8f7b\u7387\u7684\u8ba4\u4e3a\u8fd9\u4e2a RE \u6293\u4e0d\u5230\u7ed3\u679c\u3002\u7136\u800c\u7b54\u6848\u5374\u662f\u53ef\u4ee5\u7684! \u4e3a\u751a\u4e48\u5462?\u8ba9\u6211\u4eec\u91cd\u65b0\u89e3\u8bfb ab{3,5} \u8fd9\u4e2a RE \u770b\u770b:<br \/>\n\u6211\u4eec\u8981\u8868\u8fbe\u7684\u662f a \u540e\u63a5 3 \u5230 5 \u4e2a b \u5373\u53ef, \u4f46 3 \u5230 5 \u4e2a b \u540e\u9762\u6211\u4eec\u5374\u6ca1\u89c4\u5b9a\u662f\u751a\u4e48, \u56e0\u6b64\u5728 RE \u540e\u9762\u53ef\u4ee5\u662f\u4efb\u610f\u7684\u6587\u5b57, \u5f53\u7136\u5305\u62ec b \u4e5f\u53ef\u4ee5\u5566! (\u660e\u767d\u4e86\u5417?)\u540c\u6837\u7684, \u6211\u4eec\u7528 b{3,5}c \u4e5f\u540c\u6837\u53ef\u4ee5\u6293\u5230 abbbbbbbbbbc \u8fd9\u4e32\u5b57\u7684.\u4f46\u6211\u4eec\u82e5\u4f7f\u7528 ab{3,5}c \u8fd9\u6837\u7684 RE \u65f6, \u7531\u4e8e\u540c\u65f6\u6709 a \u4e0e c \u8fd9\u4e24\u4e2a\u8fb9\u754c\u5b57\u7b26, \u90a3\u5c31\u622a\u7136\u4e0d\u540c\u4e86!\u6709\u7a7a\u518d\u601d\u8003\u4e00\u4e0b, \u4e3a\u4f55\u6211\u4eec\u7528\u4e0b\u9762\u8fd9\u4e9b RE \u90fd\u53ef\u6293\u5230 abc \u8fd9\u4e32\u5b57\u5462?<\/p>\n<p>x*<\/p>\n<p>ax*, abx*, ax*b<\/p>\n<p>abcx*, abx*c, ax*bc<\/p>\n<p>bx*c, bcx*, x*bc<\/p>\n<p>(\u8fd8\u6709\u66f4\u591a&#8230;)<\/p>\n<p>\u4f46, \u82e5\u6211\u4eec\u5728\u8fd9\u4e9b RE \u524d\u540e\u5206\u522b\u52a0\u4e00\u4e2a ^ \u4e0e $ \u8fd9\u6837\u7684 anchor, \u90a3\u53c8\u5982\u4f55\u5462?\u521a\u5b66 RE \u65f6, \u53ea\u8981\u80fd\u638c\u63e1\u4e0a\u9762\u8fd9\u4e9b\u57fa\u672c\u7684 meta \u5927\u76d6\u5c31\u53ef\u4ee5\u5165\u95e8\u4e86.\u4e00\u5982\u524d\u8ff0, RE \u662f\u4e00\u79cd\u89c4\u8303\u5316\u7684\u6587\u5b57\u8868\u8fbe\u65b9\u5f0f, \u4e3b\u8981\u7528\u4e8e\u67d0\u4e9b\u6587\u5b57\u5904\u7406\u5de5\u5177\u4e4b\u95f4,\u5982 grep, perl, vi, awk, sed, \u7b49\u7b49. \u5e38\u7528\u4ee5\u8868\u793a\u4e00\u6bb5\u8fde\u7eed\u7684\u5b57\u7b26\u4e32, \u6355\u83b7\u4e4b\u6216\u66ff\u6362\u4e4b.\u7136\u800c, \u6bcf\u79cd\u5de5\u5177\u5bf9 RE \u8868\u8fbe\u5f0f\u7684\u5177\u4f53\u89e3\u8bfb\u6216\u6709\u4e00\u4e9b\u7ec6\u5fae\u5dee\u5f02, \u4e0d\u8fc7, \u57fa\u672c\u539f\u5219\u8fd8\u662f\u4e00\u81f4\u7684.\u53ea\u8981\u80fd\u638c\u63e1 RE \u7684\u57fa\u672c\u539f\u7406, \u90a3\u5c31\u4e00\u7406\u901a\u767e\u7406\u660e\u4e86, \u53ea\u662f\u5728\u5b9e\u4f5c\u65f6\u7a0d\u52a0\u53d8\u901a\u5373\u53ef. \u6bd4\u65b9\u4ee5 grep \u6765\u8bf4, \u5728 Linux \u4e0a\u4f60\u53ef\u627e\u5230 grep, egrep, fgrep \u8fd9\u51e0\u4e2a\u7a0b\u5e8f, \u5176\u5dee\u5f02\u5927\u81f4\u5982\u4e0b\uff1a<\/p>\n<p>* grep:<\/p>\n<p>\u4f20\u7edf\u7684 grep \u7a0b\u5e8f, \u5728\u6ca1\u6709\u53c2\u6570\u7684\u60c5\u51b5\u4e0b, \u53ea\u8f93\u51fa\u7b26\u5408 RE \u5b57\u7b26\u4e32\u4e4b\u53e5\u5b50. \u5e38\u89c1\u53c2\u6570\u5982\u4e0b\uff1a<\/p>\n<p>-v\u00a0\u00a0\u00a0 \u9006\u53cd\u6a21\u793a, \u53ea\u8f93\u51fa&#8221;\u4e0d\u542b&#8221; RE \u5b57\u7b26\u4e32\u4e4b\u53e5\u5b50<\/p>\n<p>-r\u00a0\u00a0\u00a0\u00a0 \u9012\u5f52\u6a21\u5f0f, \u53ef\u540c\u65f6\u5904\u7406\u6240\u6709\u5c42\u7ea7\u5b50\u76ee\u5f55\u91cc\u7684\u6587\u4ef6<\/p>\n<p>-q\u00a0\u00a0\u00a0 \u9759\u9ed8\u6a21\u5f0f, \u4e0d\u8f93\u51fa\u4efb\u4f55\u7ed3\u679c(stderr \u9664\u5916. \u5e38\u7528\u4ee5\u83b7\u53d6 return value, \u7b26\u5408\u4e3a true, \u5426\u5219\u4e3a false .)<\/p>\n<p>-i\u00a0\u00a0\u00a0\u00a0 \u5ffd\u7565\u5927\u5c0f\u5199<\/p>\n<p>-w\u00a0\u00a0 \u6574\u8bcd\u6bd4\u5bf9, \u7c7b\u4f3c &lt;word&gt;<\/p>\n<p>-n\u00a0\u00a0\u00a0 \u540c\u65f6\u8f93\u51fa\u884c\u53f7<\/p>\n<p>-c\u00a0\u00a0\u00a0 \u53ea\u8f93\u51fa\u7b26\u5408\u6bd4\u5bf9\u7684\u884c\u6570<\/p>\n<p>-l\u00a0\u00a0\u00a0\u00a0 \u53ea\u8f93\u51fa\u7b26\u5408\u6bd4\u5bf9\u7684\u6587\u4ef6\u540d\u79f0<\/p>\n<p>-o\u00a0\u00a0\u00a0 \u53ea\u8f93\u51fa\u7b26\u5408 RE \u7684\u5b57\u7b26\u4e32. (gnu \u65b0\u7248\u72ec\u6709, \u4e0d\u89c1\u5f97\u6240\u6709\u7248\u672c\u90fd\u652f\u6301.)<\/p>\n<p>-E\u00a0\u00a0\u00a0 \u5207\u6362\u4e3a egrep<\/p>\n<p>* egrep:<\/p>\n<p>\u4e3a grep \u7684\u6269\u5145\u7248\u672c, \u6539\u826f\u4e86\u8bb8\u591a\u4f20\u7edf grep \u4e0d\u80fd\u6216\u4e0d\u4fbf\u7684\u64cd\u4f5c. \u6bd4\u65b9\u8bf4:<\/p>\n<p>&#8211; grep \u4e4b\u4e0b\u4e0d\u652f\u6301 ? \u4e0e + \u8fd9\u4e24\u79cd modifier, \u4f46 egrep \u5219\u53ef.<\/p>\n<p>&#8211; grep \u4e0d\u652f\u6301 a|b \u6216 (abc|xyz) \u8fd9\u7c7b\u201c\u6216\u4e00\u201d\u6bd4\u5bf9, \u4f46 egrep \u5219\u53ef.<\/p>\n<p>&#8211; grep \u5728\u5904\u7406 {n,m} \u65f6, \u9700\u7528 { \u4e0e } \u5904\u7406, \u4f46 egrep \u5219\u4e0d\u9700<\/p>\n<p>\u8bf8\u5982\u6b64\u7c7b\u7684\uff0c\u6211\u4e2a\u4eba\u4f1a\u5efa\u8bae\u80fd\u7528 egrep \u5c31\u4e0d\u7528 grep \u5566\u3002<\/p>\n<p>* fgrep:<\/p>\n<p>\u4e0d\u4f5c RE \u5904\u7406, \u8868\u8fbe\u5f0f\u4ec5\u4f5c\u4e00\u822c\u5b57\u7b26\u4e32\u5904\u7406, \u6240\u6709 meta \u5747\u5931\u53bb\u529f\u80fd.<\/p>\n<p>\u597d\u4e86\uff0c\u5173\u4e8e RE \u7684\u5165\u95e8, \u6211\u6682\u65f6\u5c31\u4ecb\u7ecd\u5230\u8fd9\u91cc. \u867d\u7136\u5199\u5f97\u6709\u70b9\u4e71, \u4e14\u6709\u4e9b\u89c2\u5ff5\u4e5f\u4e0d\u5f88\u7cbe\u786e, \u4e0d\u8fc7, \u59d1\u4e14\u7b97\u662f\u5bf9\u5927\u5bb6\u6709\u4e00\u4e2a\u4ea4\u5dee\u5427\u3002\u82e5\u8fd9\u4e24\u5929\u8fd8\u6709\u65f6\u95f4\u7684\u8bdd, \u6211\u518d\u4e3e\u4e9b\u8303\u4f8b\u6765\u5206\u6790\u4e00\u4e0b, \u4ee5\u52a9\u5927\u5bb6\u66f4\u597d\u7684\u7406\u89e3. \u5047\u5982\u66f4\u6709\u53ef\u80fd\u7684\u8bdd, \u4e5f\u987a\u9053\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u4e00\u4e0b sed \u8fd9\u4e2a\u5de5\u5177.<\/p>\n<hr \/>\n<p>\u5b66\u4e60\/\u53c2\u8003\u94fe\u63a5\uff1a<\/p>\n<p><a href=\"http:\/\/bbs.chinaunix.net\/forum-24-1.html\" target=\"_blank\">Shell-ChinaUnix.net<\/a><\/p>\n<p><a href=\"http:\/\/bbs.chinaunix.net\/thread-218853-1-1.html\" target=\"_blank\">shell \u5341\u4e09\u554f?-Shell-ChinaUnix.net<\/a><\/p>\n<p><a href=\"http:\/\/ixyzero.com\/blog\/wp-content\/uploads\/2014\/07\/Shell\u5341\u4e09\u95ee-ChinaUnix\u7cbe\u534e\u8d34\u6574\u7406.doc\" target=\"_blank\">Shell\u5341\u4e09\u95ee-ChinaUnix\u7cbe\u534e\u8d34\u6574\u7406<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Shell\u5341\u4e09\u95ee\u2014\u2014ChinaUnix\u8bba\u575b\u7cbe\u534e\u6574\u7406 \u76ee\u5f55\u6982\u89c8 \u4e3a\u4f55\u53eb\u505a shell \uff1f shell promp [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,11,7],"tags":[65],"class_list":["post-584","post","type-post","status-publish","format-standard","hentry","category-knowledgebase-2","category-linux","category-programing","tag-shell"],"views":2976,"_links":{"self":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/comments?post=584"}],"version-history":[{"count":0,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/584\/revisions"}],"wp:attachment":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/media?parent=584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/categories?post=584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/tags?post=584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}