{"id":881,"date":"2022-09-22T15:47:00","date_gmt":"2022-09-22T07:47:00","guid":{"rendered":"https:\/\/swordofmorning.com\/?p=881"},"modified":"2025-10-09T13:55:34","modified_gmt":"2025-10-09T05:55:34","slug":"linux-bash-tutor","status":"publish","type":"post","link":"https:\/\/swordofmorning.com\/index.php\/2022\/09\/22\/linux-bash-tutor\/","title":{"rendered":"Linux Bash \u7b80\u8981\u6559\u7a0b"},"content":{"rendered":"<p><div class=\"has-toc have-toc\"><\/div><\/p>\n<p>&emsp;&emsp;\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecdBash Terminal\u7684\u4e00\u4e9b\u57fa\u7840\u8bed\u6cd5\u3002<\/p>\n<h2>\u4e00\u3001\u6587\u4ef6\u76ee\u5f55\u76f8\u5173<\/h2>\n<ol>\n<li><code>ls<\/code> i.e. list storage\uff1a\u663e\u793a\u5f53\u524d\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\u4e0e\u6587\u4ef6\u5939\u3002<\/li>\n<li><code>pwd<\/code> i.e. print work directory\uff1a\u663e\u793a\u5f53\u524d\u76ee\u5f55\u3002<\/li>\n<li><code>cd<\/code> i.e. change directory\uff1a\u4f7f\u7528dir\/dir\/\u6765\u5207\u6362\u76f8\u5bf9\u76ee\u5f55\uff08\u4e2a\u4eba\u4e60\u60ef\u4f7f\u7528.\/\uff09\uff1b\u4f7f\u7528\/dir\/dir\u6765\u5207\u6362\u7edd\u5bf9\u76ee\u5f55\u3002<\/li>\n<\/ol>\n<h3>1.1 pushd\u548cpopd<\/h3>\n<p>&emsp;&emsp;\u4e3a\u4e86\u5b9e\u73b0\u591a\u4e2a\u76ee\u5f55\u7684\u76f8\u4e92\u8df3\u8f6c\uff0c\u8fd9\u91cc\u4f7f\u7528\u4e00\u4e2a\u76ee\u5f55\u5806\u6765\u5b8c\u6210\u3002\u5f53\u524d\u7684\u76ee\u5f55\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-bash\">.\n\u251c\u2500\u2500 01.sh\n\u251c\u2500\u2500 T1\n\u251c\u2500\u2500 T2\n\u2514\u2500\u2500 T3<\/code><\/pre>\n<p>&emsp;&emsp;\u4f7f\u7528<code>dirs<\/code>\u53ef\u4ee5\u67e5\u770b\u8be5\u5806\uff1a<\/p>\n<pre><code class=\"language-bash\">xjt@u16:~\/mk\/Bash$ dirs -p -v\n 0  ~\/mk\/Bash\n 1  ~\/mk\/Bash\/T1<\/code><\/pre>\n<p>&emsp;&emsp;\u6211\u5df2\u7ecf\u5411\u8be5\u5806\u6dfb\u52a0\u4e86\u4e24\u4e2a\u76ee\u5f55\u3002\u4e0b\u9762\u6211\u4eec\u4f7f\u7528<code>pushd<\/code>\u53ef\u4ee5\u5411\u5176\u4e2d\u6dfb\u52a0\u76ee\u5f55\uff1a<\/p>\n<pre><code class=\"language-bash\">xjt@u16:~\/mk\/Bash$ pushd T2\/\n~\/mk\/Bash\/T2 ~\/mk\/Bash ~\/mk\/Bash\/T1\nxjt@u16:~\/mk\/Bash\/T2$ dirs -p -v\n 0  ~\/mk\/Bash\/T2\n 1  ~\/mk\/Bash\n 2  ~\/mk\/Bash\/T1\nxjt@u16:~\/mk\/Bash\/T2$ <\/code><\/pre>\n<p>&emsp;&emsp;\u4e4b\u540e\u5728\u4f7f\u7528<code>pushd +n<\/code>\u6765\u5207\u6362\u76ee\u5f55\uff1a<\/p>\n<pre><code class=\"language-bash\">xjt@u16:~\/mk\/Bash\/T2$ pushd +2\n~\/mk\/Bash\/T1 ~\/mk\/Bash\/T2 ~\/mk\/Bash\nxjt@u16:~\/mk\/Bash\/T1$ <\/code><\/pre>\n<p>&emsp;&emsp;\u51fa\u6808\u5219\u4f7f\u7528<code>popd<\/code>\u6765\u5b8c\u6210\uff1a<\/p>\n<pre><code class=\"language-bash\">xjt@u16:~\/mk\/Bash\/T1$ popd +0\n~\/mk\/Bash\/T2 ~\/mk\/Bash\nxjt@u16:~\/mk\/Bash\/T2$ dirs -p -v\n 0  ~\/mk\/Bash\/T2\n 1  ~\/mk\/Bash<\/code><\/pre>\n<h3>1.2 \u6587\u4ef6\u4e0e\u67e5\u627e<\/h3>\n<ol>\n<li>file\uff1a\u7528\u4e8e\u67e5\u770b\u6587\u4ef6\u5c5e\u6027\u3002<\/li>\n<li>locate\uff1a\u7528\u4e8e\u6a21\u7cca\u67e5\u627e\u6587\u4ef6\u3002<\/li>\n<\/ol>\n<h3>1.3 \u521b\u5efa\u6587\u4ef6\u5939\u4e0e\u6587\u4ef6<\/h3>\n<ol>\n<li>mkdir\uff1a\u521b\u5efa\u6587\u4ef6\u5939\u3002<\/li>\n<li>touch\uff1a\u521b\u5efa\u6587\u4ef6\u3002<\/li>\n<\/ol>\n<h3>1.4 \u62f7\u8d1d\u4e0e\u79fb\u52a8<\/h3>\n<ol>\n<li>cp\uff1a\u62f7\u8d1d\u3002<\/li>\n<li>mv\uff1a\u79fb\u52a8\u3002<\/li>\n<\/ol>\n<h2>\u4e8c\u3001\u6587\u4ef6\u7f16\u8f91<\/h2>\n<h3>2.1 concatenate<\/h3>\n<p>&emsp;&emsp;bash\u4f7f\u7528<code>cat<\/code>\u6765\u8fde\u63a5\u6587\u4ef6\uff0c\u6211\u4eec\u6709\u5982\u4e0b\u6587\u4ef6\uff1a<\/p>\n<pre><code class=\"language-bash\">.\n\u251c\u2500\u2500 file1.txt\n\u2514\u2500\u2500 file2.txt<\/code><\/pre>\n<p>&emsp;&emsp;\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528<code>cat<\/code>\u6765\u6253\u5370\u6587\u4ef6\u5185\u5bb9\uff1a<\/p>\n<pre><code class=\"language-bash\">xjt@u16:~\/mk\/Bash$ cat file1.txt \nhello\nxjt@u16:~\/mk\/Bash$ cat file2.txt \nworld<\/code><\/pre>\n<p>&emsp;&emsp;\u540c\u65f6\u80fd\u4f7f\u7528<code>&gt;&gt;<\/code>\u6765\u5411\u6587\u4ef6\u4e2d<strong>\u8ffd\u52a0<\/strong>\u5185\u5bb9\uff0c\u4f7f\u7528<code>&gt;<\/code>\u6765<strong>\u8986\u5199<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash\">xjt@u16:~\/mk\/Bash$ cat &gt;&gt; file1.txt \nworld\nxjt@u16:~\/mk\/Bash$ cat file1.txt \nhello\nworld\nxjt@u16:~\/mk\/Bash$ <\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u7ed3\u675f\u8ffd\u52a0\u5185\u5bb9\u7684\u65f6\u5019\uff0c\u4f7f\u7528<code>Ctrl+D<\/code>\u6765\u7ed3\u675f\u547d\u4ee4\u3002\u6b32\u6e05\u7a7a\u6587\u4ef6\u7684\u5185\u5bb9\u5219\u53ef\u4ee5\u4f7f\u7528<code>cat \/dev\/null &gt; file1.txt<\/code>\u6765\u5b8c\u6210\uff0c\u8be5\u547d\u4ee4\u662f\u5c06\u4e00\u4e2a\u6587\u4ef6\u7684\u5185\u5bb9<strong>\u8986\u5199<\/strong>\u5230\u53e6\u5916\u4e00\u4e2a\u6587\u4ef6\uff0c\u8ffd\u52a0\u5219\u4f7f\u7528<code>&gt;<\/code>\u3002<\/p>\n<h3>2.2 more &amp; less<\/h3>\n<p>&emsp;&emsp;\u5f53\u6211\u4eec\u60f3\u8981\u67e5\u770b\u6587\u4ef6\u5185\u5bb9\u7684\u65f6\u5019\uff0c\u53ef\u4ee5\u4f7f\u7528<code>more<\/code>\u6216\u8005<code>less<\/code>\u6765\u67e5\u770b\u3002\u4f7f\u7528more\u4e00\u6b21\u8df3\u8f6c\u591a\u884c\uff0cless\u5219\u53ef\u4ee5\u4e00\u884c\u4e00\u884c\u5730\u8df3\u8f6c\u3002\u4e24\u8005\u5747\u53ef\u4ee5\u4f7f\u7528<code>q<\/code>\u952e\u9000\u51fa\u3002<\/p>\n<h3>2.3 \u6587\u672c\u7f16\u8f91\u5668<\/h3>\n<p>&emsp;&emsp;linux\u4e0b\u7684\u7f16\u8f91\u5668\u5e38\u7528\u7684\u6709nano\u3001vim\u3001gedit\u3002\u5176\u4e2dnano\u64cd\u4f5c\u7b80\u5355\uff0c\u5728\u754c\u9762\u7684\u4e0b\u65b9\u6709\u76f8\u5e94\u7684\u63d0\u793a\uff1bvim\u548cgedit\u5219\u6ca1\u6709\uff0c\u4f46\u662f\u529f\u80fd\u66f4\u52a0\u591a\u6837\uff0c\u6bd4\u5982\u540c\u65f6\u5904\u7406\u591a\u4e2a\u6587\u4ef6\u7b49\u3002<\/p>\n<p>&emsp;&emsp;\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecd\u5982\u4f55\u7f16\u5199bash\u811a\u672c\u3002<\/p>\n<h2>\u4e09\u3001\u5f00\u59cb<\/h2>\n<p>&emsp;&emsp;bash\u811a\u672c\u4e0e\u5728\u7ec8\u7aef\u4e2d\u4f7f\u7528\u76f8\u540c\uff0c\u76f4\u63a5\u4f7f\u7528\u547d\u4ee4\u5373\u53ef\uff0c\u4e0b\u9762\u662f\u4e00\u6bb5\u7b80\u5355\u7684\u811a\u672c\uff0c\u540c\u65f6tree\u5982\u4e0b\u3002<\/p>\n<pre><code class=\"language-bash\">#! \/bin\/bash\n\nls\necho &quot;Hello World&quot;\n\n# tree\n# .\n# \u2514\u2500\u2500 run.sh<\/code><\/pre>\n<p>\u5728\u7b2c\u4e00\u884c\u7684<code>#! \/bin\/bash<\/code>\u8868\u793a\u9664\u6b64\u4e4b\u5916\u7684\u6240\u6709<code>#<\/code>\u5f15\u5bfc\u7684\u5185\u5bb9\u5747\u4e3a\u6ce8\u91ca\u3002\u503c\u5f97\u6ce8\u610f\u7684\u662f\uff0c\u6211\u4eec\u76f4\u63a5\u4f7f\u7528<code>.\/run.sh<\/code>\u662f\u65e0\u6cd5\u76f4\u63a5\u8fd0\u884c\u7684\uff0c\u6211\u4eec\u8981\u4e48\u4f7f\u7528<code>bash run.sh<\/code>\uff0c\u8981\u4e48\u7ed9\u4e88\u5b83<code>+x<\/code>\u7684\u6743\u9650\u3002\u4f8b\u5982\uff1a<\/p>\n<pre><code class=\"language-shell\">xjt@u16:~\/mk\/Bash$ bash run.sh \nrun.sh\nHello World\n\nxjt@u16:~\/mk\/Bash$ chmod +x run.sh \nxjt@u16:~\/mk\/Bash$ .\/run.sh \nrun.sh\nHello World<\/code><\/pre>\n<p>sh\u548cbash\u6709\u7740\u76f8\u4f3c\u7684\u5185\u5bb9\uff0c\u4f46\u5bf9\u4e8e\u89c4\u5219\u7684\u517c\u5bb9\u6027\u4e0d\u540c\u3002\u5bf9\u4e8eubuntu\u6765\u8bf4\uff0c<code>\/bin\/sh<\/code>\u6307\u5411<code>\/bin\/bash<\/code>\uff0c\u4f46\u662f\u4e5f\u53ef\u4ee5\u4f7f\u7528<code>-posix<\/code>\u6765\u6307\u5b9a\u5176\u6a21\u5f0f\u3002<\/p>\n<h2>\u56db\u3001\u57fa\u672c\u8bed\u6cd5<\/h2>\n<h3>4.1 if<\/h3>\n<p>&emsp;&emsp;\u4e0b\u9762\u662f\u4e00\u6bb5\u57fa\u7840\u7684\u903b\u8f91\u5224\u65ad\uff1a<\/p>\n<pre><code class=\"language-bash\">Name=&quot;XJT&quot;\n\nif [ &quot;$Name&quot; == &quot;XJT&quot; ]\nthen\n    echo &quot;Your name is XJT&quot;\nelse\n    echo &quot;Your name is not XJT&quot;\nfi<\/code><\/pre>\n<p>\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u6709\u51e0\u4e2a\u9700\u8981\u6ce8\u610f\u7684\u5730\u65b9\u3002\u4e00\u662f\u53d8\u91cf\u8d4b\u503c\u4e4b\u95f4\u662f\u4e0d\u5141\u8bb8\u6709\u7a7a\u683c\uff0c\u5373<code>Name=&quot;XJT&quot;<\/code>\uff0c\u800c\u4e0d\u662f<code>Name = &quot;XJT&quot;<\/code>\uff1b\u4e8c\u662fif\u4e4b\u540e\u4e0d\u4f7f\u7528<code>()<\/code>\uff0c\u800c\u662f\u4f7f\u7528<code>[]<\/code>\uff0c\u540c\u65f6\u9700\u8981\u6ce8\u610f\u62ec\u53f7\u524d\u540e\u5747\u6709\u7a7a\u683c\uff0c\u5373<code>if [ $val ]<\/code>\uff0c\u800c\u975e<code>if [$val]<\/code>\u3002<\/p>\n<p>&emsp;&emsp;\u63a5\u4e0b\u6765\u6211\u4eec\u770b\u4e00\u4e0b\u4e00\u822c\u53d8\u91cf\u7684\u60c5\u51b5\u3002<\/p>\n<pre><code class=\"language-bash\">Num1=3\nNum2=5\n\nif [ $Num1 -gt $Num2 ]\nthen\n    echo &quot;$Num1 is greater than $Num2&quot;\nelse\n    echo &quot;$Num1 is less than $Num2&quot;\nfi<\/code><\/pre>\n<p>&emsp;&emsp;\u63a5\u4e0b\u6765\u770b\u5bf9\u4e8e\u6587\u4ef6\u7684\u5904\u7406\u3002<\/p>\n<pre><code class=\"language-bash\">File=&quot;hello.txt&quot;\n\nif [ -f $File ]\nthen \n    echo &quot;$File Exist&quot;\nelse\n    echo &quot;$File not Exist&quot;\nfi\n\n# xjt@u16:~\/mk\/Bash$ tree\n# .\n# \u2514\u2500\u2500 run.sh\n\n# 0 directories, 1 file\n# xjt@u16:~\/mk\/Bash$ .\/run.sh\n# hello.txt not Exist\n\n# xjt@u16:~\/mk\/Bash$ touch hello.txt\n# xjt@u16:~\/mk\/Bash$ tree\n# .\n# \u251c\u2500\u2500 hello.txt\n# \u2514\u2500\u2500 run.sh\n\n# 0 directories, 2 files\n# xjt@u16:~\/mk\/Bash$ .\/run.sh\n# hello.txt Exist\n# xjt@u16:~\/mk\/Bash$ <\/code><\/pre>\n<p>\u5728\u4e0a\u9762\u7684<code>if<\/code>\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528<code>-f<\/code>\u6765\u6307\u5b9a<code>$File<\/code>\u4e3a\u6587\u4ef6\u3002\u540c\u6837\u7684\uff0c\u5176\u4ed6\u7684\u6807\u7b7e\u5982\u4e0b\uff1a<\/p>\n<ol>\n<li><code>-d<\/code>\uff0c\u662f\u76ee\u5f55<\/li>\n<li><code>-e<\/code>\uff0c\u6587\u4ef6\u5b58\u5728\uff0c\u5e38\u7528<code>-f<\/code>\u4ee3\u66ff\u3002<\/li>\n<li><code>-f<\/code>\uff0c\u63d0\u4f9b\u7684\u5b57\u7b26\u4e32\u662f\u6587\u4ef6\u3002<\/li>\n<li><code>-g<\/code>\uff0c\u6587\u4ef6\u5df2\u6709group id\u3002<\/li>\n<li><code>-r<\/code>\uff0c\u53ef\u8bfb\u3002<\/li>\n<li><code>-s<\/code>\uff0c\u5927\u5c0f\u4e0d\u4e3a\u96f6<\/li>\n<li><code>-u<\/code>\uff0c\u5df2\u6709user id\u3002<\/li>\n<li><code>-w<\/code>\uff0c\u53ef\u5199\u3002<\/li>\n<li><code>-x<\/code>\uff0c\u53ef\u6267\u884c\u3002<\/li>\n<\/ol>\n<h3>4.2 case<\/h3>\n<p>&emsp;&emsp;case\u4e0eC\u4e2d\u7684switch\u76f8\u540c\uff0c\u4e0b\u9762\u6765\u770b\u4e00\u4e0b\u5b83\u662f\u5982\u4f55\u8fd0\u4f5c\u7684\u3002<\/p>\n<pre><code class=\"language-bash\">read -p &quot;Input y\/yes or n\/no: &quot; Input\n\ncase $Input in \n    [yY] | [yY][eE][sS])\n        echo &quot;yes!&quot;\n        ;;\n    [nN] | [nN][oO])\n        echo &quot;no!&quot;\n        ;;\n    *)\n        echo &quot;default output&quot;\n        ;;\nesac<\/code><\/pre>\n<p>\u5728\u4e0a\u9762\u7684\u4ee3\u7801\u4e2d\uff0c\u6709\u51e0\u4e2a\u9700\u8981\u6ce8\u610f\u7684\u5730\u65b9\u3002\u4e00\u662f\u5728\u6bcf\u4e00\u4e2a\u5206\u652f\u7684\u540e\u9762\u9700\u8981\u52a0\u4e0a<code>)<\/code>\uff1b\u4e8c\u662f\u6bcf\u4e2a\u5206\u652f\u7ed3\u675f\u9700\u8981\u52a0\u4e0a<code>;;<\/code>\uff1b\u4e09\u662f\u6700\u540e\u7684<code>*<\/code>\u76f8\u5f53\u4e8e\u5176\u4ed6\u8bed\u8a00\u4e2d\u7684<code>default<\/code>\u3002<\/p>\n<h3>4.3 for<\/h3>\n<p>&emsp;&emsp;for\u5faa\u73af\u4e0epython\u76f8\u4f3c\uff0c\u4e0b\u9762\u662f\u4e00\u4e2a\u6700\u57fa\u672c\u7684for\u5faa\u73af\u3002<\/p>\n<pre><code class=\"language-bash\">Array=&quot;1 2 3 4 5&quot;\n\nfor it in $Array \n    do\n        echo &quot;$it&quot;\ndone<\/code><\/pre>\n<p>&emsp;&emsp;\u4e0b\u9762\u6765\u770b\u4e00\u4e2a\u5bf9\u6587\u4ef6\u91cd\u547d\u540d\u7684\u811a\u672c\uff1a<\/p>\n<pre><code class=\"language-shell\">txtFiles=$(ls *.txt)\natt=&quot;new&quot;\n\nfor file in $txtFiles\n    do\n        echo &quot;Rename $file to $att-$file&quot;\n        mv $file $att-$file\ndone<\/code><\/pre>\n<h3>4.4 while<\/h3>\n<p>&emsp;&emsp;\u63a5\u4e0b\u6765\u770b\u4e00\u4e0b\u5982\u4f55\u4f7f\u7528while\u6765\u8bfb\u53d6\u4e00\u4e2a\u6587\u4ef6\u5939\u7684\u5185\u5bb9\u3002<\/p>\n<pre><code class=\"language-bash\">Line=1\nwhile read -r CURRENT_LINE\n    do\n        echo &quot;$Line: $CURRENT_LINE&quot;\n        ((Line++))\ndone &lt; &quot;.\/file.txt&quot;<\/code><\/pre>\n<h3>4.5 function<\/h3>\n<p>&emsp;&emsp;\u4e0b\u9762\u662f\u4e00\u4e2a\u7b80\u5355\u7684Hello world\u51fd\u6570\u3002<\/p>\n<pre><code class=\"language-bash\">function hello()\n{\n    echo &quot;Hello world&quot;\n}\n\nhello<\/code><\/pre>\n<p>&emsp;&emsp;bash\u4e2d\u542b\u53c2\u51fd\u6570\u548c\u5176\u4ed6\u8bed\u8a00\u5e76\u4e0d\u4e00\u6837\uff0c\u5176\u53c2\u6570\u5e76\u4e0d\u9700\u8981\u58f0\u660e\u5230<code>()<\/code>\u4e2d\uff0c\u6765\u770b\u4e00\u4e2a\u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"language-bash\">function sum()\n{\n    let ans=$1+$2\n    echo &quot;Sum: $ans&quot;\n}\n\nsum 5 6<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>&emsp;&emsp;\u5728\u672c\u8282\u4e2d\uff0c\u6211\u4eec\u5c06\u4ecb\u7ecdBash Terminal\u7684\u4e00\u4e9b\u57fa\u7840\u8bed\u6cd5\u3002 \u4e00\u3001\u6587\u4ef6\u76ee\u5f55\u76f8\u5173 ls i.e. list &#8230;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55],"tags":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/881"}],"collection":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/comments?post=881"}],"version-history":[{"count":1,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/881\/revisions"}],"predecessor-version":[{"id":882,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/posts\/881\/revisions\/882"}],"wp:attachment":[{"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/media?parent=881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/categories?post=881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/swordofmorning.com\/index.php\/wp-json\/wp\/v2\/tags?post=881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}