Spark修炼之道(基础篇)——Linux大数据开发基础:第十四节:Shell编程入门(六)

本文主要内容

  1. case控制结构
  2. read命令
  3. 管道

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值