1 shell 简单入门
Shell是一个用C语言编写的程序,它是用户使用linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
本文主要以shell脚本为重心展开介绍。
哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。
1.1 shell分类
Linux shell的种类有很多,目前流行的 Shell 包括 ash、bash、ksh、csh、zsh…,用户可以通过查看/etc/shells
文件中的内容查看自己主机中当前有哪些种类的shell。
[root@master shell]
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
查看当前linux正在使用的shell类型
echo $SHELL
$SHELL
:是一个环境变量,它记录了Linux当前用户所使用的的shell类型。
1.2 shell脚本
1、编写规范
vim test.sh
echo "Hello World"
#!
:是约定标记,告诉系统这个标记需要什么解释器,即需要哪种shell
2、文件命名规则:以 .sh
结尾。
3、执行
shell 脚本是一种解释执行的程序,可以在终端直接调用(需要使用chmod命令赋予脚本执行权限)
chmod +x ./test.sh
4、打印当前进程
echo $$
echo "Hello World"
1.3 Shell 脚本四种启动方式
分为如下四种:
1、bash xxx.sh
2、./xxx.sh
以脚本的第一行注释为标准
#!/bin/bash
:启动一个bash子进程脚本
#!/bin/python
:执行一个pyhton脚本
3、source xxx.sh
与 . xxx.sh
在本进程运行这一个脚本,和上面的区别在于会对本进程造成影响
2 shell 变量
在Bash shell中,每个变量都是字符串。
2.1 普通变量
2.1.1 定义变量
variable=value
variable='value'
variable="value"
注意:=
周围不能有空格
url=www.couragesteak.com
echo $url
name='有勇气的牛排'
echo $name
author="导演"
echo $author
echo "I am ${name}."
输出:
www.couragesteak.com
有勇气的牛排
导演
I am 有勇气的牛排.
2.1.2 变量中单引号、双引号的区别
url=www.couragesteak.com
webUrl1='有勇气的牛排官网:${url}'
webUrl2="有勇气的牛排官网:${url}"
echo $webUrl1
echo $webUrl2
单引号' '
:被单引号包围时,单引号里面是什么就输出什么。
双引号" "
:双引号会解析里面的变量和命令,而不是原样输出。
2.1.3 将命令的结果赋值给变量
语法
variable=`command`
variable=$(command)
实例:
vim log.txt
你真棒
[root@master shell]
[root@master shell]
你真棒
2.1.4 只读变量 readonly
使用 readonly
命令可以将变量定义为只读变量,其值不可改变
url=www.couragesteak.com
readonly url
url="ccc"
输出
[root@master shell]
./test.sh: line 6: url: readonly variable
2.1.5 删除变量
语法:unset 变量名
2.2 环境变量
2.2.1 环境变量与删除
export name="有勇气的牛排"
echo $name
unset name
2.2.2 查看环境变量
查看指定环境变量
env | grep name
查看系统所有环境变量
env
2.3 特殊变量
变量 |
描述 |
$0 |
当前脚本文件名 |
$# |
传递给脚本或函数测参数个数 |
$* |
传递给脚本或函数的所有参数 |
$@ |
传递给脚本或函数的所有参数。但被双引号包含是与@、*稍有不同 |
$? |
上个名利的退出状态,或函数的返回值 |
$$ |
当前Shell进程ID |
2.4 位置参数
位置参数变量 |
描述 |
$n |
n为数字,$0表示当前Shell脚本程序的名称,$1-9代表第一道第九个参数,十以上的参数需要用大括号包含,如 {10} |
$* |
这个变量代表命令行中所有的参数,$把所有的参数看成一个整体 |
$@ |
这个变量也代表命令行中的所有参数,不过$@把每个参数区分对待 |
$# |
这个变量代表命令行中的所有参数的个数 |
2.4.1 使用脚本文件传递位置参数
语法:./脚本.sh <参数1> <参数2> ...
实例:
./test.sh charles 有勇气的牛排
echo "参数1: $1"
echo "参数2: $2"

2.4.2 使用函数传递位置参数
./test.sh
function func(){
echo "参数1:$1"
echo "参数2:$2"
}
func charles 有勇气的牛排
输出同上一个案例
2.5 键盘输入
read: usage:
read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
-a
:后面跟一个变量,多个变量,按顺序赋值
-p
:输出提示信息
-t
:秒数,等待时间(s)
-n
:数字,只接受指定长度字符,就会执行
-s
:隐藏输入的数据,适合密码等敏感信息
-d
:结束标志
-e
:在输入的时候可以使用补全功能。
实例:可补全,输入名字
read -e -p "请输入您的姓名:" -a name

3 运算符
3.1 算数运算符
原生bash不支持数学运算,不过可以通过其他命令辅助实现。
实例:计算两数之和
res=`expr 1 + 1`在这里插入代码片`
echo "结果:${res}"
echo '1+1='`expr 1 + 1`
3.2 逻辑运算符
3.3 字符串运算符
运算符 |
描述 |
举例 |
= |
判断2个字符串是否相等 |
[ $a=$b ] |
!= |
判断2个字符串是否不相等 |
[ $a!=$b ] |
-z |
判断字符串长度是否为0 |
[ -z $a ] |
-n |
判断字符串是否不为0 |
[ -n $a ] |
str |
判断字符串是否为空 |
[ $a ] |
3.4 文件测试运算符
文件测试运算符主要用于 Linux/Unix 文件的各种属性
操作符 |
描述 |
-b |
判断文件是否为 块设备 文件 |
-c |
判断文件是否为 字符设备 文件 |
-d |
判断文件是否是 目录 |
-f |
判断文件是否为 普通文件 |
-g |
判断文件是否设置了 SGID 位 |
-k |
判断文件是否设置了 粘贴位(Sticky Bit) (可理解为防删除位) |
-p |
判断文件是否有管道 |
-u |
判断文案是否设置了 SUID位 |
-r |
判断文件是否可读 |
-w |
判断文件是否可写 |
-x |
判断文件是否可执行 |
-s |
检测文件是否为空(文件大小是否>0) |
-e |
检测文件(包括目录)是否存在 |
用法如:[ -b $file ]
1、判断目录是否存在
FILE=/usr/local
if [ -d "$FILE" ]; then
echo "$FILE 存在"
else
echo "$FILE 不存在"
fi
2、判断文件是否存在
FILE=/usr/local/test/yy.txt
if [ -f "$FILE" ]; then
echo "$FILE 存在"
else
echo "$FILE 不存在"
fi
4 流程控制
4.1 if 语句
4.1.1 if-else:判断相等
read a
read b
if(($a == $b))
then
echo 'a=b'
else
echo 'a!=b'
fi
4.1.2 if-elif-else:成绩段位判断
read -p "请输入您的分数:" score
if(($score < 60));then
echo "未及格"
elif (($score >= 60 && $score < 85));then
echo "还不错"
else
echo "优秀"
fi
4.1.3 判断字符串是否为空
ifname=
if [ ! -n "$name" ]; then
echo 字符串为空
else:
ehco 字符串包含内容
fi
4.2 case条件语句
实例:根据数字判断今天是星期几
printf "星期转换\n"
read -p "请输入今天是一周的第几天:" num
case $num in
1)
echo "周一"
;;
2)
echo "周二"
;;
3)
echo "周三"
;;
4)
echo "周四"
;;
5)
echo "周五"
;;
6)
echo "周六"
;;
7)
echo "周天"
;;
esac
4.3 循环
4.3.1 for 循环
实例:计算1加到n的和
printf "计算1~n数字之和\n"
read -p "请输入n:" n
for ((i=1;i<=${n};i++))
do
((sum += i))
done
echo "结果为:$sum"

4.3.2 while循环
实例:计算1加到n的和
printf "计算1~n数字之和\n"
read -p "请输入n:" n
i=0
while ((i <= n))
do
((sum += i))
((i++))
done
echo "结果为:$sum"
4.3.3 until 循环
定义:想判断是否添加是否成立,若成立则进入循环,反之不进入。
printf "计算1~n数字之和\n"
read -p "请输入n:" n
i=0
until ((i>n))
do
((sum += i))
((i++))
done
echo "结果为:$sum"
4.4 流程控制语句
4.4.1 exit
在系统中,用于退出当前用户登录状态
在Shell脚本中,用户退出当前脚本
exit [返回值]
4.4.2 break语句
定义:跳出当前循环
4.4.3 continue 语句
定义:跳过本次循环,继续下一次循环
4.5 函数定义
语法
function 函数名 () {
程序
}
实例
function getName(){
printf "name:Charles\n"
}
getName
实例2
function getProcessPid() {
String="charles"
echo 777
echo $String
return 666
}
echo ---
name=$(getProcessPid)
echo 返回值为:$name
getProcessPid
echo 返回值为:$?
---输出
返回值为:777 charles
777
charles
返回值为:154
5 字符串操作
5.1 获取字符串长度
语法:${#您的字符串}
name="有勇气的牛排"
echo "${name}的长度为:${#name}"
5.2 字符串拼接
nick="有勇气的牛排"
obj="博客"
str1=$nick$obj
str2="$nick $obj"
str3=$nick":"$obj
str4="这里是${nick}的${obj}"
echo $str1
echo $str2
echo $str3
echo $str4

5.3 字符串截取
5.3.1 从左边开始
语法:${string : start : length}
str="abcdefgh"
echo ${str:2:3}
输出:cde
5.3.2 从右边开始
语法:${strint : 0-start : length}
str="abcdefgh"
echo ${str:0-2:3}
输出:gh
有点奇怪,以后在测试
5.3.3 从指定字符(子字符串)开始截取
语法:${string#*chars}
,星号表示通配符,也可以写其他内容。
url="https://www.couragesteak.com/"
echo ${url
输出:www.couragesteak.com/
5.3.4 使用 % 截取左边字符
url="https://www.couragesteak.com/index.html"
echo ${url%/*}
6 数组
在shell中,通过()
来表示数组,数组元组之间用空格
arr=(1 2 "有勇气的牛排")
echo ${arr[*]}
echo ${arr[@]}
echo ${arr[2]}
arr[6]=3
echo ${arr[*]}

<h2><a id="1_shell__0"></a>1 shell 简单入门</h2>
<p>Shell是一个用C语言编写的程序,它是用户使用linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。<br />
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。<br />
本文主要以shell脚本为重心展开介绍。</p>
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。</strong></font></p>
<h3><a id="11_shell_9"></a>1.1 shell分类</h3>
<p>Linux shell的种类有很多,目前流行的 Shell 包括 ash、bash、ksh、csh、zsh…,用户可以通过查看<code>/etc/shells</code>文件中的内容查看自己主机中当前有哪些种类的shell。</p>
<pre><div class="hljs"><code class="lang-powershell">[<span class="hljs-type">root</span>@<span class="hljs-type">master</span> <span class="hljs-type">shell</span>]<span class="hljs-comment"># cat /etc/shells</span>
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
</code></div></pre>
<p>查看当前linux正在使用的shell类型</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-built_in">echo</span> <span class="hljs-variable">$SHELL</span>
</code></div></pre>
<p><code>$SHELL</code>:是一个环境变量,它记录了Linux当前用户所使用的的shell类型。</p>
<h3><a id="12_shell_28"></a>1.2 shell脚本</h3>
<p><strong>1、编写规范</strong></p>
<p><code>vim test.sh</code></p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-comment"># 这是一个注释</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Hello World"</span>
</code></div></pre>
<p><code>#!</code>:是约定标记,告诉系统这个标记需要什么解释器,即需要哪种shell</p>
<p><strong>2、文件命名规则</strong>:以 <code>.sh</code> 结尾。</p>
<p><strong>3、执行</strong><br />
shell 脚本是一种解释执行的程序,可以在终端直接调用(需要使用chmod命令赋予脚本执行权限)</p>
<pre><div class="hljs"><code class="lang-powershell">chmod +x ./test.sh
</code></div></pre>
<p><strong>4、打印当前进程</strong></p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span><span class="hljs-variable">$</span> <span class="hljs-comment"># 输出当前进程PID</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"Hello World"</span>
</code></div></pre>
<h3><a id="13_Shell__60"></a>1.3 Shell 脚本四种启动方式</h3>
<p>分为如下四种:</p>
<p>1、<code>bash xxx.sh</code></p>
<ul>
<li>启动一个bash子进程,运行脚本中的命令</li>
</ul>
<p>2、<code>./xxx.sh</code></p>
<p>以脚本的第一行注释为标准</p>
<p><code>#!/bin/bash</code>:启动一个bash子进程脚本<br />
<code>#!/bin/python</code>:执行一个pyhton脚本</p>
<p>3、<code>source xxx.sh</code> 与 <code>. xxx.sh</code></p>
<p>在本进程运行这一个脚本,和上面的区别在于会对本进程造成影响</p>
<h2><a id="2_shell__78"></a>2 shell 变量</h2>
<p>在Bash shell中,每个变量都是字符串。</p>
<h3><a id="21__81"></a>2.1 普通变量</h3>
<h4><a id="211__82"></a>2.1.1 定义变量</h4>
<pre><div class="hljs"><code class="lang-powershell">variable=value
variable=<span class="hljs-string">'value'</span>
variable=<span class="hljs-string">"value"</span>
</code></div></pre>
<p>注意:<code>=</code>周围不能有空格</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
url=www.couragesteak.com
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$url</span>
name=<span class="hljs-string">'有勇气的牛排'</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$name</span>
author=<span class="hljs-string">"导演"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$author</span>
<span class="hljs-comment"># {} 可以帮助识别变量边界</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"I am <span class="hljs-variable">$</span>{name}."</span>
</code></div></pre>
<p>输出:</p>
<pre><div class="hljs"><code class="lang-powershell">www.couragesteak.com
有勇气的牛排
导演
I am 有勇气的牛排.
</code></div></pre>
<h4><a id="212__115"></a>2.1.2 变量中单引号、双引号的区别</h4>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
url=www.couragesteak.com
webUrl1=<span class="hljs-string">'有勇气的牛排官网:${url}'</span>
webUrl2=<span class="hljs-string">"有勇气的牛排官网:<span class="hljs-variable">$</span>{url}"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$webUrl1</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$webUrl2</span>
</code></div></pre>
<p>单引号<code>' '</code>:被单引号包围时,单引号里面是什么就输出什么。</p>
<p>双引号<code>" "</code>:双引号会解析里面的变量和命令,而不是原样输出。</p>
<h4><a id="213__132"></a>2.1.3 将命令的结果赋值给变量</h4>
<p>语法</p>
<pre><div class="hljs"><code class="lang-powershell">variable=`command` <span class="hljs-comment"># 不推荐,易混淆</span>
variable=<span class="hljs-variable">$</span>(command)
</code></div></pre>
<p>实例:</p>
<pre><div class="hljs"><code class="lang-powershell">vim log.txt
你真棒
</code></div></pre>
<pre><div class="hljs"><code class="lang-powershell">[<span class="hljs-type">root</span>@<span class="hljs-type">master</span> <span class="hljs-type">shell</span>]<span class="hljs-comment"># log=$(cat log.txt)</span>
[<span class="hljs-type">root</span>@<span class="hljs-type">master</span> <span class="hljs-type">shell</span>]<span class="hljs-comment"># echo $log</span>
你真棒
</code></div></pre>
<h4><a id="214__readonly_153"></a>2.1.4 只读变量 readonly</h4>
<p>使用 <code>readonly</code>命令可以将变量定义为只读变量,其值不可改变</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
url=www.couragesteak.com
readonly url
url=<span class="hljs-string">"ccc"</span>
</code></div></pre>
<p>输出</p>
<pre><div class="hljs"><code class="lang-powershell">[<span class="hljs-type">root</span>@<span class="hljs-type">master</span> <span class="hljs-type">shell</span>]<span class="hljs-comment"># ./test.sh</span>
./test.sh: line <span class="hljs-number">6</span>: url: readonly variable
</code></div></pre>
<h4><a id="215__171"></a>2.1.5 删除变量</h4>
<p>语法:<code>unset 变量名</code></p>
<h3><a id="22__174"></a>2.2 环境变量</h3>
<h4><a id="221__175"></a>2.2.1 环境变量与删除</h4>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment"># 使用export声明</span>
export name=<span class="hljs-string">"有勇气的牛排"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$name</span>
</code></div></pre>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment"># 删除环境变量name</span>
unset name
</code></div></pre>
<h4><a id="222__186"></a>2.2.2 查看环境变量</h4>
<p>查看指定环境变量</p>
<pre><div class="hljs"><code class="lang-powershell">env | grep name
</code></div></pre>
<p>查看系统所有环境变量</p>
<pre><div class="hljs"><code class="lang-powershell">env
</code></div></pre>
<h3><a id="23__196"></a>2.3 特殊变量</h3>
<table>
<thead>
<tr>
<th>变量</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>$0</td>
<td>当前脚本文件名</td>
</tr>
<tr>
<td>$#</td>
<td>传递给脚本或函数测参数个数</td>
</tr>
<tr>
<td>$*</td>
<td>传递给脚本或函数的所有参数</td>
</tr>
<tr>
<td>$@</td>
<td>传递给脚本或函数的所有参数。但被双引号包含是与@、*稍有不同</td>
</tr>
<tr>
<td>$?</td>
<td>上个名利的退出状态,或函数的返回值</td>
</tr>
<tr>
<td>$$</td>
<td>当前Shell进程ID</td>
</tr>
</tbody>
</table>
<h3><a id="24__209"></a>2.4 位置参数</h3>
<table>
<thead>
<tr>
<th>位置参数变量</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>$n</td>
<td>n为数字,$0表示当前Shell脚本程序的名称,$1-9代表第一道第九个参数,十以上的参数需要用大括号包含,如 {10}</td>
</tr>
<tr>
<td>$*</td>
<td>这个变量代表命令行中所有的参数,$把所有的参数看成一个整体</td>
</tr>
<tr>
<td>$@</td>
<td>这个变量也代表命令行中的所有参数,不过$@把每个参数区分对待</td>
</tr>
<tr>
<td>$#</td>
<td>这个变量代表命令行中的所有参数的个数</td>
</tr>
</tbody>
</table>
<h4><a id="241__217"></a>2.4.1 使用脚本文件传递位置参数</h4>
<p>语法:<code>./脚本.sh <参数1> <参数2> ...</code></p>
<p>实例:</p>
<pre><div class="hljs"><code class="lang-powershell">./test.sh charles 有勇气的牛排
</code></div></pre>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"参数1: <span class="hljs-variable">$1</span>"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"参数2: <span class="hljs-variable">$2</span>"</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/5eac37c17bec2acc97629055faccd3c4.png" alt="image.png" /></p>
<h4><a id="242__235"></a>2.4.2 使用函数传递位置参数</h4>
<pre><div class="hljs"><code class="lang-powershell">./test.sh
</code></div></pre>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-comment"># 定义函数</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">func</span><span class="hljs-params">()</span></span>{
<span class="hljs-built_in">echo</span> <span class="hljs-string">"参数1:<span class="hljs-variable">$1</span>"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"参数2:<span class="hljs-variable">$2</span>"</span>
}
<span class="hljs-comment"># 调用函数</span>
func charles 有勇气的牛排
</code></div></pre>
<p>输出同上一个案例</p>
<h3><a id="25__255"></a>2.5 键盘输入</h3>
<pre><div class="hljs"><code class="lang-powershell">read: usage:
read [-<span class="hljs-type">ers</span>] [-<span class="hljs-type">a</span> <span class="hljs-built_in">array</span>] [-<span class="hljs-type">d</span> <span class="hljs-type">delim</span>] [-<span class="hljs-type">i</span> <span class="hljs-type">text</span>] [-<span class="hljs-type">n</span> <span class="hljs-type">nchars</span>] [-<span class="hljs-type">N</span> <span class="hljs-type">nchars</span>] [-<span class="hljs-type">p</span> <span class="hljs-type">prompt</span>] [-<span class="hljs-type">t</span> <span class="hljs-type">timeout</span>] [-<span class="hljs-type">u</span> <span class="hljs-type">fd</span>] [<span class="hljs-type">name</span> <span class="hljs-type">...</span>]
</code></div></pre>
<p><code>-a</code>:后面跟一个变量,多个变量,按顺序赋值<br />
<code>-p</code>:输出提示信息<br />
<code>-t</code>:秒数,等待时间(s)<br />
<code>-n</code>:数字,只接受指定长度字符,就会执行<br />
<code>-s</code>:隐藏输入的数据,适合密码等敏感信息<br />
<code>-d</code>:结束标志<br />
<code>-e</code>:在输入的时候可以使用补全功能。</p>
<p>实例:可补全,输入名字</p>
<pre><div class="hljs"><code class="lang-powershell">read <span class="hljs-literal">-e</span> <span class="hljs-literal">-p</span> <span class="hljs-string">"请输入您的姓名:"</span> <span class="hljs-literal">-a</span> name
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/958be5df5416230549acc776d5dc735f.png" alt="image.png" /></p>
<h2><a id="3__276"></a>3 运算符</h2>
<h3><a id="31__277"></a>3.1 算数运算符</h3>
<p>原生bash不支持数学运算,不过可以通过其他命令辅助实现。</p>
<p>实例:计算两数之和</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
res=`expr <span class="hljs-number">1</span> + <span class="hljs-number">1</span>`在这里插入代码片`
<span class="hljs-built_in">echo</span> <span class="hljs-string">"结果:<span class="hljs-variable">$</span>{res}"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">'1+1='</span>`expr <span class="hljs-number">1</span> + <span class="hljs-number">1</span>`
</code></div></pre>
<h3><a id="32__290"></a>3.2 逻辑运算符</h3>
<table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>-a</td>
<td>与</td>
</tr>
<tr>
<td>-o</td>
<td>或</td>
</tr>
<tr>
<td>!</td>
<td>非</td>
</tr>
</tbody>
</table>
<h3><a id="33__296"></a>3.3 字符串运算符</h3>
<table>
<thead>
<tr>
<th>运算符</th>
<th>描述</th>
<th>举例</th>
</tr>
</thead>
<tbody>
<tr>
<td>=</td>
<td>判断2个字符串是否相等</td>
<td>[ $a=$b ]</td>
</tr>
<tr>
<td>!=</td>
<td>判断2个字符串是否不相等</td>
<td>[ $a!=$b ]</td>
</tr>
<tr>
<td>-z</td>
<td>判断字符串长度是否为0</td>
<td>[ -z $a ]</td>
</tr>
<tr>
<td>-n</td>
<td>判断字符串是否不为0</td>
<td>[ -n $a ]</td>
</tr>
<tr>
<td>str</td>
<td>判断字符串是否为空</td>
<td>[ $a ]</td>
</tr>
</tbody>
</table>
<h3><a id="34__305"></a>3.4 文件测试运算符</h3>
<p>文件测试运算符主要用于 Linux/Unix 文件的各种属性</p>
<table>
<thead>
<tr>
<th>操作符</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>-b</td>
<td>判断文件是否为 块设备 文件</td>
</tr>
<tr>
<td>-c</td>
<td>判断文件是否为 字符设备 文件</td>
</tr>
<tr>
<td>-d</td>
<td>判断文件是否是 目录</td>
</tr>
<tr>
<td>-f</td>
<td>判断文件是否为 普通文件</td>
</tr>
<tr>
<td>-g</td>
<td>判断文件是否设置了 SGID 位</td>
</tr>
<tr>
<td>-k</td>
<td>判断文件是否设置了 粘贴位(Sticky Bit) (可理解为防删除位)</td>
</tr>
<tr>
<td>-p</td>
<td>判断文件是否有管道</td>
</tr>
<tr>
<td>-u</td>
<td>判断文案是否设置了 SUID位</td>
</tr>
<tr>
<td>-r</td>
<td>判断文件是否可读</td>
</tr>
<tr>
<td>-w</td>
<td>判断文件是否可写</td>
</tr>
<tr>
<td>-x</td>
<td>判断文件是否可执行</td>
</tr>
<tr>
<td>-s</td>
<td>检测文件是否为空(文件大小是否>0)</td>
</tr>
<tr>
<td>-e</td>
<td>检测文件(包括目录)是否存在</td>
</tr>
</tbody>
</table>
<p>用法如:<code>[ -b $file ]</code></p>
<p>1、判断目录是否存在</p>
<pre><div class="hljs"><code class="lang-sh"><span class="hljs-comment"># 判断目录是否存在</span>
FILE=/usr/local
<span class="hljs-keyword">if</span> [ -d <span class="hljs-string">"<span class="hljs-variable">$FILE</span>"</span> ]; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$FILE</span> 存在"</span>
<span class="hljs-keyword">else</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$FILE</span> 不存在"</span>
<span class="hljs-keyword">fi</span>
</code></div></pre>
<p>2、判断文件是否存在</p>
<pre><div class="hljs"><code class="lang-sh">FILE=/usr/local/test/yy.txt
<span class="hljs-keyword">if</span> [ -f <span class="hljs-string">"<span class="hljs-variable">$FILE</span>"</span> ]; <span class="hljs-keyword">then</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$FILE</span> 存在"</span>
<span class="hljs-keyword">else</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$FILE</span> 不存在"</span>
<span class="hljs-keyword">fi</span>
</code></div></pre>
<h2><a id="4__347"></a>4 流程控制</h2>
<h3><a id="41_if__348"></a>4.1 if 语句</h3>
<h4><a id="411_ifelse_349"></a>4.1.1 if-else:判断相等</h4>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
read a
read b
<span class="hljs-keyword">if</span>((<span class="hljs-variable">$a</span> == <span class="hljs-variable">$b</span>))
then
<span class="hljs-built_in">echo</span> <span class="hljs-string">'a=b'</span>
<span class="hljs-keyword">else</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">'a!=b'</span>
fi
</code></div></pre>
<h4><a id="412_ifelifelse_364"></a>4.1.2 if-elif-else:成绩段位判断</h4>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
read <span class="hljs-literal">-p</span> <span class="hljs-string">"请输入您的分数:"</span> score
<span class="hljs-keyword">if</span>((<span class="hljs-variable">$score</span> < <span class="hljs-number">60</span>));then
<span class="hljs-built_in">echo</span> <span class="hljs-string">"未及格"</span>
elif ((<span class="hljs-variable">$score</span> >= <span class="hljs-number">60</span> && <span class="hljs-variable">$score</span> < <span class="hljs-number">85</span>));then
<span class="hljs-built_in">echo</span> <span class="hljs-string">"还不错"</span>
<span class="hljs-keyword">else</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"优秀"</span>
fi
</code></div></pre>
<h4><a id="413__379"></a>4.1.3 判断字符串是否为空</h4>
<pre><div class="hljs"><code class="lang-powershell">ifname=
<span class="hljs-keyword">if</span> [ ! -<span class="hljs-type">n</span> <span class="hljs-string">"<span class="hljs-variable">$name</span>"</span> ]; then
<span class="hljs-built_in">echo</span> 字符串为空
<span class="hljs-keyword">else</span>:
ehco 字符串包含内容
fi
</code></div></pre>
<h3><a id="42_case_390"></a>4.2 case条件语句</h3>
<p>实例:根据数字判断今天是星期几</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
printf <span class="hljs-string">"星期转换\n"</span>
read <span class="hljs-literal">-p</span> <span class="hljs-string">"请输入今天是一周的第几天:"</span> num
case <span class="hljs-variable">$num</span> <span class="hljs-keyword">in</span>
<span class="hljs-number">1</span>)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"周一"</span>
;;
<span class="hljs-number">2</span>)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"周二"</span>
;;
<span class="hljs-number">3</span>)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"周三"</span>
;;
<span class="hljs-number">4</span>)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"周四"</span>
;;
<span class="hljs-number">5</span>)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"周五"</span>
;;
<span class="hljs-number">6</span>)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"周六"</span>
;;
<span class="hljs-number">7</span>)
<span class="hljs-built_in">echo</span> <span class="hljs-string">"周天"</span>
;;
esac
</code></div></pre>
<h3><a id="43__423"></a>4.3 循环</h3>
<h4><a id="431_for__425"></a>4.3.1 for 循环</h4>
<p>实例:计算1加到n的和</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
printf <span class="hljs-string">"计算1~n数字之和\n"</span>
read <span class="hljs-literal">-p</span> <span class="hljs-string">"请输入n:"</span> n
<span class="hljs-keyword">for</span> ((i=<span class="hljs-number">1</span>;i<=<span class="hljs-variable">$</span>{n};i++))
<span class="hljs-keyword">do</span>
((sum += i))
done
<span class="hljs-built_in">echo</span> <span class="hljs-string">"结果为:<span class="hljs-variable">$sum</span>"</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/01034703d80df02afca4d53f13a3dd9d.png" alt="image.png" /></p>
<h4><a id="432_while_443"></a>4.3.2 while循环</h4>
<p>实例:计算1加到n的和</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
printf <span class="hljs-string">"计算1~n数字之和\n"</span>
read <span class="hljs-literal">-p</span> <span class="hljs-string">"请输入n:"</span> n
i=<span class="hljs-number">0</span>
<span class="hljs-keyword">while</span> ((i <= n))
<span class="hljs-keyword">do</span>
((sum += i))
((i++))
done
<span class="hljs-built_in">echo</span> <span class="hljs-string">"结果为:<span class="hljs-variable">$sum</span>"</span>
</code></div></pre>
<h4><a id="433_until__460"></a>4.3.3 until 循环</h4>
<p>定义:想判断是否添加是否成立,若成立则进入循环,反之不进入。</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
printf <span class="hljs-string">"计算1~n数字之和\n"</span>
read <span class="hljs-literal">-p</span> <span class="hljs-string">"请输入n:"</span> n
i=<span class="hljs-number">0</span>
<span class="hljs-keyword">until</span> ((i>n))
<span class="hljs-keyword">do</span>
((sum += i))
((i++))
done
<span class="hljs-built_in">echo</span> <span class="hljs-string">"结果为:<span class="hljs-variable">$sum</span>"</span>
</code></div></pre>
<h3><a id="44__478"></a>4.4 流程控制语句</h3>
<h4><a id="441_exit_479"></a>4.4.1 exit</h4>
<p>在系统中,用于退出当前用户登录状态</p>
<p>在Shell脚本中,用户退出当前脚本</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-keyword">exit</span> [返回值]
</code></div></pre>
<h4><a id="442_break_487"></a>4.4.2 break语句</h4>
<p>定义:跳出当前循环</p>
<h4><a id="443_continue__490"></a>4.4.3 continue 语句</h4>
<p>定义:跳过本次循环,继续下一次循环</p>
<h3><a id="45__494"></a>4.5 函数定义</h3>
<p>语法</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-function"><span class="hljs-keyword">function</span> 函数名 <span class="hljs-params">()</span></span> {
程序
}
</code></div></pre>
<p>实例</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getName</span><span class="hljs-params">()</span></span>{
printf <span class="hljs-string">"name:Charles\n"</span>
}
getName
</code></div></pre>
<p>实例2</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/sh</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getProcessPid</span><span class="hljs-params">()</span></span> {
String=<span class="hljs-string">"charles"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-number">777</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$String</span>
<span class="hljs-keyword">return</span> <span class="hljs-number">666</span>
}
<span class="hljs-built_in">echo</span> <span class="hljs-literal">---</span>
name=<span class="hljs-variable">$</span>(getProcessPid)
<span class="hljs-built_in">echo</span> 返回值为:<span class="hljs-variable">$name</span>
getProcessPid
<span class="hljs-built_in">echo</span> 返回值为:<span class="hljs-variable">$</span>?
<span class="hljs-literal">---</span>输出
返回值为:<span class="hljs-number">777</span> charles
<span class="hljs-number">777</span>
charles
返回值为:<span class="hljs-number">154</span>
</code></div></pre>
<h2><a id="5__540"></a>5 字符串操作</h2>
<h3><a id="51__541"></a>5.1 获取字符串长度</h3>
<p>语法:<code>${#您的字符串}</code></p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
name=<span class="hljs-string">"有勇气的牛排"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$</span>{name}的长度为:<span class="hljs-variable">$</span>{#name}"</span>
</code></div></pre>
<h3><a id="52__549"></a>5.2 字符串拼接</h3>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
nick=<span class="hljs-string">"有勇气的牛排"</span>
obj=<span class="hljs-string">"博客"</span>
<span class="hljs-comment"># 连续拼接</span>
str1=<span class="hljs-variable">$nick</span><span class="hljs-variable">$obj</span>
<span class="hljs-comment"># 中间加内容</span>
str2=<span class="hljs-string">"<span class="hljs-variable">$nick</span> <span class="hljs-variable">$obj</span>"</span>
str3=<span class="hljs-variable">$nick</span><span class="hljs-string">":"</span><span class="hljs-variable">$obj</span>
<span class="hljs-comment"># 不规则拼接</span>
str4=<span class="hljs-string">"这里是<span class="hljs-variable">$</span>{nick}的<span class="hljs-variable">$</span>{obj}"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$str1</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$str2</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$str3</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$str4</span>
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/28b7844659565cc062b5ba666204d6bd.png" alt="image.png" /></p>
<h3><a id="53__575"></a>5.3 字符串截取</h3>
<h4><a id="531__576"></a>5.3.1 从左边开始</h4>
<p>语法:<code>${string : start : length}</code></p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
str=<span class="hljs-string">"abcdefgh"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{str:<span class="hljs-number">2</span>:<span class="hljs-number">3</span>}
</code></div></pre>
<p>输出:cde</p>
<h4><a id="532__587"></a>5.3.2 从右边开始</h4>
<p>语法:<code>${strint : 0-start : length}</code></p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
str=<span class="hljs-string">"abcdefgh"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{str:<span class="hljs-number">0</span><span class="hljs-literal">-2</span>:<span class="hljs-number">3</span>}
</code></div></pre>
<p>输出:gh</p>
<p><mark>有点奇怪,以后在测试</mark></p>
<h4><a id="533__600"></a>5.3.3 从指定字符(子字符串)开始截取</h4>
<p>语法:<code>${string#*chars}</code>,星号表示通配符,也可以写其他内容。</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
url=<span class="hljs-string">"https://www.couragesteak.com/"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{url<span class="hljs-comment">#*//}</span>
</code></div></pre>
<p>输出:www.couragesteak.com/</p>
<h4><a id="534____611"></a>5.3.4 使用 % 截取左边字符</h4>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
url=<span class="hljs-string">"https://www.couragesteak.com/index.html"</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{url%/*}
<span class="hljs-comment"># 输出:https://www.couragesteak.com</span>
</code></div></pre>
<h2><a id="6__621"></a>6 数组</h2>
<p>在shell中,通过<code>()</code>来表示数组,数组元组之间用空格</p>
<pre><div class="hljs"><code class="lang-powershell"><span class="hljs-comment">#!/bin/bash</span>
<span class="hljs-comment"># 不要求类型完全相同</span>
arr=(<span class="hljs-number">1</span> <span class="hljs-number">2</span> <span class="hljs-string">"有勇气的牛排"</span>)
<span class="hljs-comment"># 后去数组中所有元素</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{arr[*]}
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{arr[<span class="hljs-selector-tag">@</span>]}
<span class="hljs-comment"># 根据下标获取, 起始为0</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{arr[<span class="hljs-number">2</span>]}
<span class="hljs-comment"># 数组长度不固定</span>
arr[<span class="hljs-number">6</span>]=<span class="hljs-number">3</span>
<span class="hljs-built_in">echo</span> <span class="hljs-variable">$</span>{arr[*]}
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/edd0769f77f625f62c9e40e56987e827.png" alt="image.png" /></p>
留言