{"id":2448,"date":"2015-08-02T22:58:25","date_gmt":"2015-08-02T14:58:25","guid":{"rendered":"http:\/\/ixyzero.com\/blog\/?p=2448"},"modified":"2015-08-02T22:58:25","modified_gmt":"2015-08-02T14:58:25","slug":"bash%e4%b8%ad%e7%9a%84%e5%9c%86%e6%8b%ac%e5%8f%b7%e4%b8%ad%e6%8b%ac%e5%8f%b7%e5%a4%a7%e6%8b%ac%e5%8f%b7","status":"publish","type":"post","link":"https:\/\/ixyzero.com\/blog\/archives\/2448.html","title":{"rendered":"Bash\u4e2d\u7684\u5706\u62ec\u53f7\/\u4e2d\u62ec\u53f7\/\u5927\u62ec\u53f7"},"content":{"rendered":"<p>\u5706\u62ec\u53f7 -&gt; Parenthesis: ()<br \/>\n\u4e2d\u62ec\u53f7 -&gt; Brackets: []\u00a0 #\u4e5f\u53eb\u505a\u201csquare brackets\u201d<br \/>\n\u5927\u62ec\u53f7 -&gt; Braces: {}\u00a0 \u00a0#\u4e5f\u53eb\u505a\u201ccurly braces\u201d<\/p>\n<h6>\u641c\u7d22\u5173\u952e\u5b57\uff1a<\/h6>\n<ul>\n<li>bash bracket parenthesis brace<\/li>\n<li>bash square brackets<\/li>\n<\/ul>\n<h6>\u53c2\u8003\u94fe\u63a5\uff1a<\/h6>\n<ul>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/2188199\/how-to-use-double-or-single-bracket-parentheses-curly-braces\">http:\/\/stackoverflow.com\/questions\/2188199\/how-to-use-double-or-single-bracket-parentheses-curly-braces<\/a><\/li>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/13542832\/bash-if-difference-between-square-brackets-and-double-square-brackets\">http:\/\/stackoverflow.com\/questions\/13542832\/bash-if-difference-between-square-brackets-and-double-square-brackets<\/a><\/li>\n<li><a href=\"http:\/\/ss64.com\/bash\/syntax-brackets.html\">http:\/\/ss64.com\/bash\/syntax-brackets.html<\/a><\/li>\n<li><a href=\"http:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/Command-Grouping.html\">http:\/\/www.gnu.org\/software\/bash\/manual\/html_node\/Command-Grouping.html<\/a><\/li>\n<li><a href=\"http:\/\/linuxconfig.org\/bash-scripting-parenthesis-explained\">http:\/\/linuxconfig.org\/bash-scripting-parenthesis-explained<\/a><\/li>\n<li><a href=\"http:\/\/www.cnblogs.com\/fhefh\/archive\/2011\/04\/16\/2017895.html\">http:\/\/www.cnblogs.com\/fhefh\/archive\/2011\/04\/16\/2017895.html<\/a><\/li>\n<\/ul>\n<h5>==Bash\u4e2d\u7684\u201c[\u201d\u548c\u201c[[\u201d\u7684\u533a\u522b==<\/h5>\n<ul>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/8934012\/when-square-brackets-are-required-in-bash-if-statement\">http:\/\/stackoverflow.com\/questions\/8934012\/when-square-brackets-are-required-in-bash-if-statement<\/a><\/li>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/14496428\/meaning-of-double-square-brackets-in-bash\">http:\/\/stackoverflow.com\/questions\/14496428\/meaning-of-double-square-brackets-in-bash<\/a><\/li>\n<li><a href=\"http:\/\/unix.stackexchange.com\/questions\/99185\/what-do-square-brackets-mean-without-the-if-on-the-left\">http:\/\/unix.stackexchange.com\/questions\/99185\/what-do-square-brackets-mean-without-the-if-on-the-left<\/a><\/li>\n<li><a href=\"http:\/\/unix.stackexchange.com\/questions\/32210\/using-single-or-double-bracket-bash\">http:\/\/unix.stackexchange.com\/questions\/32210\/using-single-or-double-bracket-bash<\/a><\/li>\n<li><a href=\"http:\/\/serverfault.com\/questions\/52034\/what-is-the-difference-between-double-and-single-square-brackets-in-bash\">http:\/\/serverfault.com\/questions\/52034\/what-is-the-difference-between-double-and-single-square-brackets-in-bash<\/a><\/li>\n<\/ul>\n<h6>\u53c2\u8003\u89e3\u7b54\uff1a<\/h6>\n<p>\u5728Bash\u4e2d\uff0ctest\u548c [ \u662f\u5185\u7f6e\u7684\u3002<\/p>\n<p><a href=\"http:\/\/mywiki.wooledge.org\/BashFAQ\/031\" target=\"_blank\">\u53cc\u65b9\u62ec\u53f7<\/a> [[ \u53ef\u4ee5\u63d0\u4f9b\u66f4\u591a\u7684\u529f\u80fd\uff0c\u6bd4\u5982\uff1a\u4f60\u53ef\u4ee5\u4f7f\u7528&amp;&amp;\u548c||\u66ff\u4ee3-a\u548c-o\uff0c\u4ee5\u53ca\u4f7f\u7528 =~ \u8fdb\u884c\u6b63\u5219\u5339\u914d\u3002<\/p>\n<p>\u5927\u62ec\u53f7\u9664\u4e86\u53ef\u4ee5\u9650\u5b9a\u53d8\u91cf\u540d\u8fdb\u884c\u53c2\u6570\u6269\u5c55\uff0c\u8fd8\u53ef\u4ee5\u7528\u6765\u8fdb\u884c\u5982\u4e0b\u64cd\u4f5c\uff1a<\/p>\n<p><span style=\"color: #ff0000;\"><strong>\u622a\u53d6\u53d8\u91cf\u7684\u90e8\u5206\u5185\u5bb9<\/strong><\/span><\/p>\n<pre class=\"lang:default decode:true\">$ var=\"abcde\"; echo ${var%d*}\nabc<\/pre>\n<p>\u548csed\u4e00\u6837<span style=\"color: #ff0000;\"><strong>\u8fdb\u884c\u5185\u5bb9\u66ff\u6362<\/strong><\/span><\/p>\n<pre class=\"lang:default decode:true\">$ var=\"abcde\"; echo ${var\/de\/12}\nabc12<\/pre>\n<p><span style=\"color: #ff0000;\"><strong>\u8bbe\u7f6e\u9ed8\u8ba4\u503c<\/strong><\/span><\/p>\n<pre class=\"lang:default decode:true\">$ default=\"hello\"; unset var; echo ${var:-$default}\nhello<\/pre>\n<p>\u8fd8\u6709\u5c31\u662f\uff0c\u5927\u62ec\u53f7\u6269\u5c55\u53ef\u4ee5\u521b\u5efa\u5b57\u7b26\u4e32\u5217\u8868\u7528\u4e8e\u8fdb\u884c\u5faa\u73af\u8fed\u4ee3\uff1a<\/p>\n<pre class=\"lang:default decode:true\">$ echo f{oo,ee,a}d\nfood feed fad\n\n$ mv error.log{,.OLD}\n(error.log is renamed to error.log.OLD because the brace expression expands to \"mv error.log error.log.OLD\")\n\n$ for num in {000..2}; do echo \"$num\"; done\n000\n001\n002\n\n$ echo {00..8..2}  #\u53ea\u5728Bash 4\u4e4b\u540e\u53ef\u7528\n00 02 04 06 08\n\n$ echo {D..T..4}\nD H L P T<\/pre>\n<p>&nbsp;<\/p>\n<p>\u53cc\u5706\u62ec\u53f7 (( )) \u4e00\u822c\u7528\u4e8e<a href=\"http:\/\/tiswww.case.edu\/php\/chet\/bash\/bashref.html#SEC33\" target=\"_blank\">\u7b97\u672f\u8fd0\u7b97<\/a>\uff1a<\/p>\n<pre class=\"lang:default decode:true\">((a++))\n((meaning = 42))\nfor ((i=0; i&lt;10; i++))\necho $((a + b + (14 * c)))<\/pre>\n<p><strong><span style=\"color: #ff0000;\">\u5728 (( )) \u5185\u90e8\u5141\u8bb8\u6574\u6570\u548c\u6570\u7ec4\u53d8\u91cf\u7701\u7565$\u7b26\u53f7\uff0c\u8fd8\u53ef\u4ee5\u5728\u64cd\u4f5c\u7b26\u4e4b\u95f4\u6dfb\u52a0\u7a7a\u683c\u4ee5\u589e\u52a0\u53ef\u8bfb\u6027<\/span><\/strong>\u3002<\/p>\n<p>\u5355\u65b9\u62ec\u53f7\u4e5f\u53ef\u7528\u4e8e\u6807\u8bc6<a href=\"http:\/\/tiswww.case.edu\/php\/chet\/bash\/bashref.html#SEC85\" target=\"_blank\">\u6570\u7ec4\u4e0b\u6807<\/a>\uff1a<\/p>\n<pre class=\"lang:default decode:true\">array[4]=\"hello\"\nelement=${array[4]}<\/pre>\n<p>\u5706\u62ec\u53f7 () \u53ef\u7528\u4e8e\u521b\u5efa\u5b50shell\uff0c\u4e5f\u53ef\u7528\u4e8e\u521b\u5efa\u6570\u7ec4\uff1a<\/p>\n<pre class=\"lang:default decode:true\">array=(1 2 3)\necho ${array[1]}\n2<\/pre>\n<p>==<\/p>\n<pre class=\"lang:default decode:true\">$ VARIABLE=abcdef\n$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi\nyes\n\n$ type [\n[ is a shell builtin<\/pre>\n<pre class=\"lang:default decode:true\">$ VARIABLE=abcdef\n$ if [[ $VARIABLE == 123456 ]] ; then echo yes ; else echo no ; fi\nno\n\n$ type [[\n[[ is a shell keyword<\/pre>\n<pre class=\"lang:default decode:true\">$ pwd\n\/home\/user\n$ (cd \/tmp; pwd)\n\/tmp\n$ pwd\n\/home\/user<\/pre>\n<p>\u4ece\u4e0a\u9762\u7684\u793a\u4f8b\u4e2d\u53ef\u4ee5\u770b\u51fa\uff0c<strong><span style=\"color: #ff0000;\">\u7528 () \u521b\u5efa\u7684\u5b50shell\u53ef\u4ee5\u5728\u4e0d\u5f71\u54cd\u5f53\u524d\u73af\u5883\u7684\u60c5\u51b5\u4e0b\u8fdb\u884c\u64cd\u4f5c<\/span><\/strong>\u3002<\/p>\n<p>\u5927\u62ec\u53f7 {} \u7528\u4e8e\u660e\u786e\u6807\u8bc6\u53d8\u91cf\uff1a<\/p>\n<pre class=\"lang:default decode:true\">$ VARIABLE=abcdef\n$ echo Variable: $VARIABLE\nVariable: abcdef\n$ echo Variable: $VARIABLE123456\nVariable:\n$ echo Variable: ${VARIABLE}123456\nVariable: abcdef123456<\/pre>\n<p>\u5927\u62ec\u53f7 {} \u540c\u6837\u53ef\u4ee5\u7528\u6765\u5728\u5f53\u524dshell\u73af\u5883\u4e2d\u6267\u884c\u4e00\u4e2a\u547d\u4ee4\u5e8f\u5217\uff1a<\/p>\n<pre class=\"lang:default decode:true\">$ { date; top -b -n1 | head ; } &gt;logfile\n# 'date' and 'top' output are concatenated,\n# could be useful sometimes to hunt for a top loader )\n\n$ { date; make 2&gt;&amp;1; date; } | tee logfile\n# now we can calculate the duration of a build from the logfile<\/pre>\n<p><strong><span style=\"color: #ff0000;\">\u4e0e () \u4e0d\u540c\u7684\u662f\uff0c\u5728\u4f7f\u7528 {} \u65f6\uff0c\u6700\u540e\u4e00\u4e2a\u547d\u4ee4\u5fc5\u987b\u8981\u5e26\u4e0a\u4e00\u4e2a\u5206\u53f7\uff0c\u4ee5\u53ca\u5728 { \u548c } \u4e24\u7aef\u9700\u8981\u6709\u7a7a\u683c<\/span><\/strong>\u3002<\/p>\n<p>==<\/p>\n<h6>\u65b9\u62ec\u53f7 -&gt; Brackets<\/h6>\n<pre class=\"lang:default decode:true\">if [ CONDITION ]    Test construct\nif [[ CONDITION ]]  Extended test construct\nArray[1]=element1   Array initialization\n[a-z]               Range of characters within a Regular Expression<\/pre>\n<h6>\u5927\u62ec\u53f7 -&gt; Curly Brackets<\/h6>\n<pre class=\"lang:default decode:true\">${variable}                             Parameter substitution\n${!variable}                            Indirect variable reference\n{ command1; command2; . . . commandN; } Block of code\n{string1,string2,string3,...}           Brace expansion\n{a..z}                                  Extended brace expansion\n{}                                      Text replacement, after find and xargs<\/pre>\n<h6>\u5706\u62ec\u53f7 -&gt; Parentheses<\/h6>\n<pre class=\"lang:default decode:true\">( command1; command2 )             Command group executed within a subshell\nArray=(element1 element2 element3) Array initialization\nresult=$(COMMAND)                  Command substitution, new style\n&gt;(COMMAND)                         Process substitution\n&lt;(COMMAND)                         Process substitution<\/pre>\n<h6>\u53cc\u5706\u62ec\u53f7 -&gt; Double Parentheses<\/h6>\n<pre class=\"lang:default decode:true\">(( var = 78 ))            Integer arithmetic\nvar=$(( 20 + 5 ))         Integer arithmetic, with variable assignment\n(( var++ ))               C-style variable increment\n(( var-- ))               C-style variable decrement\n(( var0 = var1&lt;98?9:21 )) C-style ternary operation<\/pre>\n<p>=EOF=<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5706\u62ec\u53f7 -&gt; Parenthesis: () \u4e2d\u62ec\u53f7 -&gt; Brackets: []\u00a0 #\u4e5f\u53eb\u505a\u201c [&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":[83,553,554,555],"class_list":["post-2448","post","type-post","status-publish","format-standard","hentry","category-knowledgebase-2","category-linux","category-programing","tag-bash","tag-brace","tag-bracket","tag-parenthesis"],"views":3365,"_links":{"self":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/2448","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=2448"}],"version-history":[{"count":0,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/2448\/revisions"}],"wp:attachment":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/media?parent=2448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/categories?post=2448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/tags?post=2448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}