福建厦门赵 發表於 2023-11-18 00:00:00

一步步教你如何编写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&lt;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>
        &gt;是覆盖, &gt;&gt;是在后面追加</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 &gt;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&gt;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">&lt;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]
查看完整版本: 一步步教你如何编写Shell脚本