本文主要内容
- case控制结构
- read命令
- 管道
1. case控制结构
参考:http://blog.csdn.net/dreamtdp/article/details/8048720
case控制结构语法格式:
<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">case expression <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> pattern1 ) statements ;; pattern2 ) statements ;; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span> esac</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>
case控制结构较之于if条件判断,代码可读性更强,典型的应用场景是:编写的shell Script可能会跨越好几种平台,如Linux、FreeBSD、Solaris等等,而各平台之间,多多少少都有不同之处,有时候需要判断目前正在那一种平台上执行。此时可以利用uname命令与case控制结构搭配使用,具体代码如下:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># vim case01.sh</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#!/bin/sh </span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#uname -s获取linux系统内核</span> <span class="hljs-constant" style="box-sizing: border-box;">SYSTEM</span>=`uname -s` <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">case</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$SYSTEM</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> <span class="hljs-constant" style="box-sizing: border-box;">Linux</span>) echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"My system is Linux"</span> echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Do Linux stuff here..."</span> ;; <span class="hljs-constant" style="box-sizing: border-box;">FreeBSD</span>) echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"My system is FreeBSD"</span> echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Do FreeBSD stuff here..."</span> ;; *) echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Unknown system : $SYSTEM"</span> echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"I don't what to do..."</span> ;; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#case的反拼写法</span> esac root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># chmod a+x case01.sh </span> root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># ./case01.sh </span> <span class="hljs-constant" style="box-sizing: border-box;">My</span> system is <span class="hljs-constant" style="box-sizing: border-box;">Linux</span> <span class="hljs-constant" style="box-sizing: border-box;">Do</span> <span class="hljs-constant" style="box-sizing: border-box;">Linux</span> stuff here... </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li></ul>
2. read命令
read命令在shell脚本中很重要,学用这个命令来接受用户输入,直接上代码演示它的使用方法:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># vim read.sh</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#! /bin/bash</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#-p(prompt) 选项表示,输出提示,本例中会输出"pleas input a number:",提示用输入</span> read -p <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"pleas input a number:"</span> num[敲回车] echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"the input number is $num"</span> root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># chmod a+x read.sh </span> root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># ./read.sh </span> pleas input a <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">number:</span><span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span> the input number is <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>
上面给出的代码在输完12后,敲回车后脚本将继续运行,对变量num输出。read命令还有一种用法是,当输出的字符满n个后脚本继续运行,具体使用如下:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># vim read.sh</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#! /bin/bash</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#-n 4 选项表示,输入满4个字符后,接着执行后面的脚本 </span> read -p <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"please input:"</span> -n <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> num echo <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"the input is $num"</span> root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># vim read02.sh</span> root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># chmod a+x read02.sh </span> root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/ShellLearning/Chapter14</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># ./read02.sh </span> please <span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">input:</span>readthe input is read </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
有时候我们要输入密码等敏感字符,此时可以使用-s 选项,具体使用代码如下:
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-shebang" style="color: rgb(0, 102, 102); box-sizing: border-box;">#! /bin/bash</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#-s(secret) 选项,输入时不会显示在终端</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">read</span> -p <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"pleas input the passwd:"</span> <span class="hljs-operator" style="box-sizing: border-box;">-s</span> password <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"the input passwd is <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$password</span>"</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
还有一种常用的用法是超时未输入则继续运行脚本,未输入的变量可以用默认的值
<code class="hljs bash has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-shebang" style="color: rgb(0, 102, 102); box-sizing: border-box;">#! /bin/bash</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#-t 2 表示两秒后未输入,则继续运行剩余脚本</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">read</span> -t <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> inputStr <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">echo</span> <span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$inputStr</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
3. 管道
管理在linux操作系统中是一个非常重要的概念,在实际使用中使用非常广泛,管理命令的格式如下:
<code class="hljs smalltalk has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">cmd1 <span class="hljs-localvars" style="box-sizing: border-box;">| cmd2 | cmd3 </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
指的是cmd1的输出作为cmd2的输入,cmd2的输出又作为cmd3 的输入,如此串起来很像一个管道(pipe),例如下面这个命令常用来查看ssh服务是否启动:
<code class="hljs perl has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//ps -e命令得到的进程信息输出作为 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">grep</span>命令的输入,过滤出包含ssh的进程信息 root<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@sparkslave02</span>:~<span class="hljs-regexp" style="color: rgb(0, 136, 0); box-sizing: border-box;">/ShellLearning/</span>Chapter14<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># ps -e | grep ssh</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1673</span> ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">00</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">00</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">00</span> sshd <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1794</span> ? <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">00</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">00</span>:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">00</span> ssh-agent </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>
转载: http://blog.csdn.net/lovehuangjiaju/article/details/48918493