一步步教你如何编写Shell脚本
<p><span><strong>问题:</strong></span></p>
<ul>
<li>
请求在线api, 获取json格式的返回结果</li>
<li>
解析json里面的一个值</li>
<li>
将该值存储到文件</li>
</ul>
<p>
<span><strong>开发准备</strong></span></p>
<p>
<strong>1、shell</strong></p>
<p>
快速入门:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_251519">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash preprocessor bold">#!/bin/sh</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash functions">cd</code> <code class="bash plain">~</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash functions">mkdir</code> <code class="bash plain">shell_tut</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash functions">cd</code> <code class="bash plain">shell_tut</code>
</div>
<div class="line number5 index4 alt2">
<code class="bash keyword">for</code> <code class="bash plain">((i=0; i<10; i++)); </code><code class="bash keyword">do</code>
</div>
<div class="line number6 index5 alt1">
<code class="bash spaces"> </code><code class="bash functions">touch</code> <code class="bash plain">test_$i.txt</code>
</div>
<div class="line number7 index6 alt2">
<code class="bash keyword">done</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
创建一个文件夹, 并在里面新建10个文件</p>
<p>
<strong>2、curl</strong></p>
<p>
使用curl请求网络, 并获取返回值</p>
<p>
curl基本用法:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_154097">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ curl www.sina.com</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
直接返回网页内容</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_109752">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">$ curl -o [文件名] www.sina.com</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
将网页内容存储到文件中, 相当于wget命令</p>
<p>
赋值操作:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_416964">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">response=$(curl www.sina.com)</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash functions">echo</code> <code class="bash plain">$response</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<span><strong>注意:</strong></span> =前后没有空格</p>
<p>
<span><strong>jq</strong></span></p>
<p>
jq是命令行解析json的很好的工具</p>
<p>
<strong>安装</strong></p>
<p>
直接到官网下载Linux64版本(我是用本地下载好后传上服务器的, 之前直接在服务器用wget下载一直报错Segmentation fault, 折腾好久~)</p>
<p>
将其copy到bin目录</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_717458">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash functions">cp</code> <code class="bash plain">jq-linux64 </code><code class="bash plain">/usr/bin/jq</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>使用</strong></p>
<p>
然后就可以愉快的使用jq命令了:</p>
<p>
可直接查看官网Tutorial</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_486207">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">curl </code><code class="bash string">'https://api.github.com/repos/stedolan/jq/commits?per_page=5'</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
返回的是一个json数组列表</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_225052">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">curl </code><code class="bash string">'https://api.github.com/repos/stedolan/jq/commits?per_page=5'</code> <code class="bash plain">| jq </code><code class="bash string">'.'</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
使用.直接指向json的根节点</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_186567">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">curl </code><code class="bash string">'https://api.github.com/repos/stedolan/jq/commits?per_page=5'</code> <code class="bash plain">| jq </code><code class="bash string">'.'</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
为取数组的第0位的对象</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_438163">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">jq </code><code class="bash string">'. | {message: .commit.message, name: .commit.committer.name}'</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
可用过连续的.操作获取对应json对象中的属性值, 上面的命令将会生成一个{message: "....", name: "...."}的json对象.</p>
<p>
<span><strong>shell文件读写</strong></span></p>
<p>
<strong>1、写</strong></p>
<p>
方式一:</p>
<p>
将ll的内容写入fileName这个文件中</p>
<p>
>是覆盖, >>是在后面追加</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_50449">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash plain">ll >fileName</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
但是在书写.sh脚本的时候, 需要增加echo</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterbash" id="highlighter_671858">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash functions">echo</code> <code class="bash plain">ll>fileName</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>2、读</strong></p>
<div>
<div class="syntaxhighlighterbash" id="highlighter_425030">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="bash keyword">while</code> <code class="bash functions">read</code> <code class="bash plain">LINE</code>
</div>
<div class="line number2 index1 alt1">
<code class="bash keyword">do</code>
</div>
<div class="line number3 index2 alt2">
<code class="bash functions">echo</code> <code class="bash plain">$LINE</code>
</div>
<div class="line number4 index3 alt1">
<code class="bash keyword">done</code><code class="bash plain"><fileName</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<p>
fileName是即将读取的文件名</p>
<p>
<span><strong>总结</strong></span></p>
<p>
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
原文链接:http://blog.loujiwei.cn/2017/02/24/服务器/2017-02-24-如何编写Shell脚本/</p>
頁:
[1]