<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>shell &#8211; 寂静花园</title>
	<atom:link href="https://www.addesp.com/archives/tag/shell/feed" rel="self" type="application/rss+xml" />
	<link>https://www.addesp.com</link>
	<description>寂静中交织着热情</description>
	<lastBuildDate>Mon, 25 Oct 2021 16:18:43 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>
	<item>
		<title>shell 脚本入门笔记</title>
		<link>https://www.addesp.com/archives/927</link>
					<comments>https://www.addesp.com/archives/927#respond</comments>
		
		<dc:creator><![CDATA[ADD-SP]]></dc:creator>
		<pubDate>Fri, 11 Sep 2020 20:28:05 +0000</pubDate>
				<category><![CDATA[笔记]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">https://www.addesp.com/?p=927</guid>

					<description><![CDATA[被迫学习 shell]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">基本格式</h2>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
echo 'Hello World'</code></pre>



<p class="wp-block-paragraph"><code>#!/bin/bash</code>：脚本的第一行声明了脚本的解释器，对于 shell 脚本解释器通常为 <code>/bin/bash</code>，当然如果是 python 脚本也可以写成 <code>#!/bin/python</code>。</p>



<p class="wp-block-paragraph">第一行之后的所有内容就是具体的命令，变量以及函数了。</p>



<h2 class="wp-block-heading">运行方式</h2>



<pre class="wp-block-code language-shell"><code># 使用脚本中声明的解释器解释执行，如果未声明则使用当前 shell 解释执行。
./script.sh

# 使用指定的解释器执行
# 使用 /bin/sh 解释执行
sh script.sh
# 使用 /bin/bash 解释执行
bash script.sh</code></pre>



<h2 class="wp-block-heading">变量</h2>



<h3 class="wp-block-heading">永久环境变量</h3>



<p class="wp-block-paragraph">本质属于文件，对于所有 shell 均可访问。</p>



<h3 class="wp-block-heading">临时环境变量</h3>



<p class="wp-block-paragraph">只允许当前 shell 以及其子 shell 访问。一般通过 <code>export</code> 来设置。</p>



<pre class="wp-block-code language-shell"><code>export VAR_NAME=alice</code></pre>



<h3 class="wp-block-heading">临时变量</h3>



<p class="wp-block-paragraph">仅仅允许当前 shell 访问。直接在声明即可。shell 脚本中不存在高级语言中局部变量这个概念，也就是 shell 脚本中任何位置声明的变量均为全局变量。</p>



<pre class="wp-block-code language-shell"><code>var1=1</code></pre>



<h3 class="wp-block-heading">特殊变量</h3>



<figure class="wp-block-table"><table><tbody><tr><td>变量</td><td>含义</td></tr><tr><td>$0</td><td>当前脚本的文件名</td></tr><tr><td>$n</td><td>传递给脚本或函数的参数。n 是一个数字，表示第几个参数。例如，第一个参数是$1，第二个参数是$2。</td></tr><tr><td>$#</td><td>传递给脚本或函数的参数个数。</td></tr><tr><td>$*<br></td><td>传递给脚本或函数的所有参数。</td></tr><tr><td>$@</td><td>传递给脚本或函数的所有参数。被双引号(&#8221; &#8220;)包含时，与 $* 稍有不同，下面将会讲到。</td></tr><tr><td>$?<br></td><td>上个命令的退出状态，或函数的返回值。</td></tr><tr><td>$$</td><td>当前Shell进程ID。对于 Shell 脚本，就是这些脚本所在的进程ID。</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">\$* 和 \$@</h4>



<p class="wp-block-paragraph">这两个变量在不使用双引号包裹的时候完全一样</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
function foo()
{
    for var in $*
    do
        # -e 表示启用转义字符
        echo -e "$var\n"
    done
}

foo 1 2 3 4 5</code></pre>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
function foo()
{
    for var in $@
    do
        # -e 表示启用转义字符
        echo -e "$var\n"
    done
}

foo 1 2 3 4 5</code></pre>



<p class="wp-block-paragraph">上面两个脚本的执行结果一样：</p>



<pre class="wp-block-preformatted">1
2
3
4
5</pre>



<p class="wp-block-paragraph">但是一旦被双引号包裹就不一样了</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
function foo()
{
    for var in "$*"
    do
        # -e 表示启用转义字符
        echo -e "$var\n"
    done
}

foo 1 2 3 4 5</code></pre>



<p class="wp-block-paragraph">输出为 <code>1 2 3 4 5</code>[换行]</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
function foo()
{
    for var in $@
    do
        # -e 表示启用转义字符
        echo -e "$var\n"
    done
}

foo 1 2 3 4 5</code></pre>



<p class="wp-block-paragraph">输出结果依旧为</p>



<pre class="wp-block-preformatted">1
2
3
4
5</pre>



<h2 class="wp-block-heading">基础算数运算</h2>



<p class="wp-block-paragraph">可以进行简单的四则运算。但是 bash 不支持浮点运算，所以除法会直接截断小鼠部分。同时由于 <code>*</code> 在 shell 中有特殊的含义，所以必须使用 <code>\</code> 进行转义才能使用乘法。</p>



<pre class="wp-block-code language-shell"><code># 结果为 3
expr 1 + 2

# 结果为 -1
expr 1 - 2

# 结果为 6
expr 2 \* 3

# 结果为 2
expr 5 / 2</code></pre>



<h2 class="wp-block-heading">条件判断</h2>



<p class="wp-block-paragraph">Shell中的 <code>test </code>命令用于检查某个条件是否成立，它可以进行数值、字符和文件三个方面的测试。 <code>test</code> 可以用 <code>[]</code> 代替，如 <code>test $var1 -eq $var2</code> 与 <code>[ $var1 -eq $var2 ]</code> 等价。但是不允许省略空格，也就是说 <code>[$var1 -eq $var2]</code> 是错的。</p>



<h3 class="wp-block-heading">数字比较</h3>



<figure class="wp-block-table is-style-regular"><table><tbody><tr><td>参数</td><td>作用</td><td>举例</td></tr><tr><td>-eq</td><td>相等则为真</td><td><code>test $var1 -eq $var2</code></td></tr><tr><td>-ne</td><td>不等则为假</td><td><code>test $var1 -ne $var2</code></td></tr><tr><td>-gt</td><td>大于则为真</td><td><code>test $var1 -gt $var2</code></td></tr><tr><td>-ge</td><td>大于等于则为真</td><td><code>test $var1 -ge $var2</code></td></tr><tr><td>-lt</td><td>小于则为真</td><td><code>test $var1 -lt $var2</code></td></tr><tr><td>-le</td><td>小于等于则为真</td><td><code>test $var1 -le $var2</code></td></tr></tbody></table><figcaption>数字比较</figcaption></figure>



<h3 class="wp-block-heading">字符串比较</h3>



<figure class="wp-block-table"><table><tbody><tr><td>参数</td><td>作用</td><td>举例</td></tr><tr><td>=</td><td>等于则为真</td><td><code>test $str1 = $str2</code></td></tr><tr><td>!=</td><td>不等则为真</td><td><code>test $str1 != $str2</code></td></tr><tr><td>-z</td><td>字符串长度为零则为真</td><td><code>test -z $str1</code></td></tr><tr><td>-n</td><td>字符串长度不为零则为真</td><td><code>test -n $str1</code></td></tr></tbody></table><figcaption>字符串比较</figcaption></figure>



<h3 class="wp-block-heading">文件判断</h3>



<figure class="wp-block-table"><table><tbody><tr><td>参数</td><td>作用</td><td>举例</td></tr><tr><td>-e</td><td>如果文件存在则为真</td><td><code>test -e $filename</code></td></tr><tr><td>-r</td><td>如果文件存在且可读则为真</td><td><code>test -r $filename</code></td></tr><tr><td>-w</td><td>如果文件存在且可写则为真</td><td><code>test -w $filename</code></td></tr><tr><td>-x</td><td>如果文件存在且可执行则为真</td><td><code>test -x $filename</code></td></tr><tr><td>-s</td><td>如果文件存在且至少有一个字符则为真</td><td><code>test -s $filename</code></td></tr><tr><td>-d</td><td>如果文件存在且为目录则为真</td><td><code>test -d $filename</code></td></tr><tr><td>-f</td><td>如果文件存在且为普通文件则为真</td><td><code>test -f $filename</code></td></tr><tr><td>-c</td><td>如果文件存在且为字符型特殊文件则为真</td><td><code>test -c $filename</code></td></tr><tr><td>-b</td><td>如果文件存在且为块特殊文件则为真</td><td><code>test -b $filename</code></td></tr></tbody></table><figcaption>文件判断</figcaption></figure>



<h2 class="wp-block-heading">流程控制</h2>



<h3 class="wp-block-heading">if</h3>



<h4 class="wp-block-heading">语法</h4>



<pre class="wp-block-code language-shell"><code>if boolean ; then
    # TODO
fi

if boolean
then
   # TODO
fi</code></pre>



<h4 class="wp-block-heading">举例</h4>



<p class="wp-block-paragraph">shell 代码</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
if &#91; 1 -eq 2 ] ; then
    echo '1 == 2'</code></pre>



<p class="wp-block-paragraph">等价 C 代码</p>



<pre class="wp-block-code language-shell"><code>if (1 == 2) {
    printf("1 == 2");
}</code></pre>



<h3 class="wp-block-heading">if···else</h3>



<h4 class="wp-block-heading">语法</h4>



<pre class="wp-block-code language-shell"><code>if boolean ; then
    # TODO
else
    # TODO
fi

if boolean
then
    # TODO
else
    # TODO
fi</code></pre>



<h4 class="wp-block-heading">举例</h4>



<p class="wp-block-paragraph">shell 代码</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
if &#91; 1 -eq 2 ] ; then
    echo '1 == 2'
else
    echo '1 != 2'
fi</code></pre>



<p class="wp-block-paragraph">等价 C 代码</p>



<pre class="wp-block-code language-shell"><code>if (1 == 2) {
    printf("1 == 2");
} else {
    printf("1 != 2");
}</code></pre>



<h3 class="wp-block-heading">if···elif</h3>



<pre class="wp-block-code language-shell"><code>if boolean ; then
    # TODO
elif boolean ; then
    # TODO
fi

if boolean
then
    # TODO
elif boolean
then
    # TODO
fi</code></pre>



<h3 class="wp-block-heading">for</h3>



<h4 class="wp-block-heading">语法</h4>



<pre class="wp-block-code language-shell"><code>for var in item0 item1 item2 ....
do
    # TODO
done</code></pre>



<h4 class="wp-block-heading">举例</h4>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
for num in 1 2 3 4 5
do
    # -e 代表开启字符转义
    echo -e "${num}\n"
done </code></pre>



<p class="wp-block-paragraph">结果</p>



<pre class="wp-block-preformatted">1
2
3
4
5</pre>



<h3 class="wp-block-heading">while</h3>



<h4 class="wp-block-heading">语法</h4>



<pre class="wp-block-code language-shell"><code>while boolean
do
    # TODO
done</code></pre>



<h4 class="wp-block-heading">举例</h4>



<p class="wp-block-paragraph">shell 代码</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
max=6
num=0
while &#91; $num -lt $max ]
do
    echo -e "${num}\n"
    num=`expr $num + 1`
done</code></pre>



<p class="wp-block-paragraph">等价 C 代码</p>



<pre class="wp-block-code language-shell"><code>int max = 6, num = 0;
while (num &lt; max) {
    printf("%d\n", num);
    num += 1;
}</code></pre>



<h2 class="wp-block-heading">函数</h2>



<h3 class="wp-block-heading">语法</h3>



<pre class="wp-block-code language-shell"><code># 声明函数（无论有无参数括号内均为空）
function name()
{
    # TODO
    return value
}

# 调用参数，后面跟上若干的参数
name 1 2 3 ...</code></pre>



<p class="wp-block-paragraph">其中 function 可以省略，return 也可以省略，返回值默认为最后一条指令的执行结果，return 只允许接数字，且范围为$[0,255]$。</p>



<h3 class="wp-block-heading">举例</h3>



<pre class="wp-block-code language-shell"><code>#!/bin/bash

function sum()
{
    ret=0
    for num in $@
    do
            ret=`expr $ret + $num`
    done
    return $ret
}

# 计算 1 + 2 + 3
sum 1 2 3
echo $?</code></pre>



<h2 class="wp-block-heading">双引号、单引号和反引号</h2>



<h3 class="wp-block-heading">双引号</h3>



<p class="wp-block-paragraph">双引号中允许使用变量。</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
str=World
echo "Hello $str"</code></pre>



<p class="wp-block-paragraph">结果为 Hello World。</p>



<h3 class="wp-block-heading">单引号</h3>



<p class="wp-block-paragraph">单引号中的内容将原文输出，但是不对转义符生效。</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
str=World
echo 'Hello $str'</code></pre>



<p class="wp-block-paragraph">结果为 Hello $str。</p>



<h3 class="wp-block-heading">反引号</h3>



<p class="wp-block-paragraph">会将反引号中的命令作为返回值</p>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
list=`ls`
echo $list</code></pre>



<p class="wp-block-paragraph">结果是当前目录中的文件。</p>



<h2 class="wp-block-heading">$()</h2>



<p class="wp-block-paragraph"><code>$()</code> 类似函数一样让我们将某个命令赋值给某个变量，当使用该变量时才会执行对应的命令并将返回值作为变量的值。</p>



<h2 class="wp-block-heading">(())</h2>



<p class="wp-block-paragraph">扩展运算，支持了 C 语言大部分的写法。</p>



<ul class="wp-block-list"><li>在双括号结构中，所有表达式可以像c语言一样，如：<code>a++</code>，<code>b--</code> 等。</li><li>在双括号结构中，所有变量可以不加入：<code>$</code> 符号前缀。</li><li>双括号可以进行逻辑运算，四则运算。</li><li>双括号结构 扩展了 <code>for</code>，<code>while</code>, <code>if</code> 条件测试运算</li><li>支持多个表达式运算，各个表达式之间用 <code>,</code> 分开。</li></ul>



<pre class="wp-block-code language-shell"><code>#!/bin/bash
num=1
((num++))
((num=num+1+2-3*4/5))
((num+=1+2-3*4/5))

# 打印 &#91;0...9]
for((i=0;i&lt;10;i++))
do
    echo -e "$((i))\n"
done

# 如果 5 能被 2 整除则输出 true，反之输出 false
if ((5%2==0)) ; then
    echo 'true'
else
    echo 'false'
</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://www.addesp.com/archives/927/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
