小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
前言
shell 是程序设计语言之一,相比起其他高级语言来说比没有那么强大,但俗话说“麻雀虽小,五脏俱全”,高级语言有的基本功能,shell也有,比如函数、结构化语法像if...else,while等
我们已经学习对shell脚本学习了三期内容:
-
shell脚本工作原理浅析中对shell脚本工作方式及类型进行了解和学习。
-
shell脚本入门一,基础知识对shell 变量、数组、状态码等入门语法等学习
-
shell脚本入门二,函数使用对shell 函数定义、调用、传参进行学习
本期,我们将继续对shell 进阶的语法结构化命令学习,Let's go~
1. 结构化命令概述
shell 作为一个程序设计语言之一,也支持结构化命令使用
结构化命令包含:选择结构、循环结构
- 选择结构:if..then;..fi、case in
- 循环结构:for、while、until、select
- 其他:break、continue
2. if-then的使用
if-then语法形式主要两种形式:
- if 语句推荐格式
if [ condition ]
then
cmds
elif [ condition ]
then
cmds
else
cmds
fi
- 也可以将then和if写在一行
if [ condition ]; then
cmds
elif [ condition ]
then
cmds
else
cmds
fi
-
方括号两边各有一个空格,必须加上,否则报错;
-
方括号内可进行数值比较、字符串比较、文件比较
2.1 数值比较
| 比较 | 描述 |
|---|---|
| n1 -eq n2 | equal |
| n1 -ge n2 | great or equal |
| n1 -gt n2 | great than |
| n1 -le n2 | less or equal |
| n1 -lt n2 | less than |
| n1 -ne n2 | not equal |
2.2 字符串比较
| 比较 | 描述 |
|---|---|
| str1 = str2 | str1是否等于str2 |
| str1 != str2 | str1是否不等于str2 |
| str1 < str2 | str1小于str2 |
| str1 > str2 | str1大于str2 |
| -n str1 | str1的长度是否不为0 |
| -z str1 | str1的长度是否为0 |
关于字符串大于、小于的比较,我们都知道shell里头有重定向符 > ,因此在做大小比较时需要添加转义,如:
if [ $str1 \> $str2 ]
是不是很麻烦?
此时我们可以用if-then的高级特性,双方括号[[ expression ]]
那双方括号高级在哪里呢?
除了不需要再做转义之外,还可以在双方括号里头写匹配模式,如:
if [[ $USER == r*ky ]]
[[ expression ]内重点总结:
- 对 > 、< 不需要转义,转义后会出错
- 对变量名不需要用"",即使变量是空值,也不会出错
PS:忘记单方括号的使用吧,直接用双方括号!
2.3 文件比较
文件的比较在shell里头用得非常非常的多,也非常的有用!!
| 比较 | 描述 |
|---|---|
| -d file | 检查file是否存在且是一个目录 |
| -e file | 检查file是否存在 |
| -f file | 检查file是否存在且是文件 |
| -r file | 检查file是否存在且可读 |
| -w file | 检查file是否存在且可写 |
| -x file | 检查file是否存在且可执行 |
| file1 -nt file2 | equal |
| file1 -ot file2 | equal |
2.4 复合条件
我们可以使用 && 和 ||将多个条件进行组合:
&&: 相当于 “and”||: 相当于 “or”
if [ condition1 ] && [ condition2 ]
if [ condition1 ] || [ condition2 ]
3. case的使用
case 也是shell 结构分支之一,当判断条件多的时候,我们就可以使用case。
case 语法结构:
case variable in
pattern1 | pattern2) cmds1;;
pattern3) cmds2;;
*) default cmds;;
esac
- case、in、esac 是 shell 关键字
- variable 是表达式,既可以是变量、数字、字符串,还可以是数学表达式、命令执行结果
- pattern 是匹配模式,可以是数字、字符串、还可以是正则表达式
4. for循环的使用
shell 循环for 如同其他语言一样,使用灵活,且代码简洁
for 循环语法结构:
标准结构如下
for ((exp1;exp2;exp3))
do
cmds
done
- exp1、exp2、exp3是三个表达式,其中exp1是初始化语句、exp2是判断条件、exp3是自增或自减,都可以省略
- cmds 是循环体语法,可以一条,也可以有多条
- do 和 done 是 shell 中的关键子
同时,shell for循环也支持Python的for写法
for var in list
do
cmds
done
list格式说明
-
具体的值
in 关键字后面可以直接给出具体的值,多个值之间以空格分隔,如
10 20 30、"hello" "jue" "jin"
for var in 10 20 30
do
echo $var
done
-
取值范围
-
可以直接使用
{start..end} -
start 表示起始值、end 表示终止值
-
中间用两个点号相连
-
for var in {A..z}
do
echo $var
done
- 使用命令执行结果
使用反引号``或者$()都可以取得命令的执行结果
sum=0
for var in $(seq 2 2 100)
do
((sum+=n))
done
echo $sum
- 使用shell通配符
shell 通配符被认为一种简化的正则表达式
通常用来匹配目录或者文件,而不是文本
for file in *.txt
do
echo $file
done
- 特殊变量
我们之间在函数中了解到,一些特殊的变量:
$#:表示输入参数的个数
$*:把所有命令行参数当作整体
$@:获取传入的参数数组,用于for循环遍历
$?:获取状态码或者函数返回值
$$:当前shell进程ID
function func(){
for str in $@
do
echo $str
done
}
func hello jue jin
5. while的使用
while 循环是shell脚本最简单的一种循环。
while语法格式为:
while conditions
do
cmds
done
- condition:表示判断条件
- cmds:表示要执行的语句
while循环的执行流程为:
- 首先对condition进行判断,如果该条件成立,进入循环,执行do...done循环体
- 执行完done后,会再一次对condition进行判断,如果成立则继续执行循环体
- 如果不支持,则会退出while循环
我们来看一个例子🌰:
var1=10
while [ $var1 -gt 0 ]
do
echo $var1
var1=$[ $var1-1 ]
done
6. until的使用
until 循环执行逻辑与while循环相反,当判断条件不成立时才进行循环,一旦判断成功,则终止循环
until 语法结构:
until conditions
do
cmds
done
- condition:表示判断条件
- cmds:执行的语句
i=1
sum=0
until ((i > 100))
do
((sum +=i))
((i++))
done
echo $sum
以上,相比while循环,判断条件为((i<=100))
7. break命令
在使用循环时候,当满足条件时,可以使用break跳出循环体
break 关键字通常和 if 语句一起使用,即满足条件时便跳出循环。
我们来看如下案例:
当var等于5时,则会推出while循环
while [ $var1 -lt 10 ]
do
if [ $var1 -eq 5 ]
then
break
fi
echo "Iteration: $var1"
var1=$[ $var1 + 1 ]
done
8. continue命令
continue 关键字作用代表当满足条件时,则会跳过本次步骤后继续进行下一次循环
continue 关键字也通常和 if 语句一起使用
我们来看一个案例如下:
当var等于5时,则跳过这次打印,继续打印后续的数字
for var1 in 1 2 3 4 5 6 7 8 9 10
do
if [ $var1 -eq 5 ]
then
continue
fi
echo "Iteration number: $var1"
done
9. 好用命令行工具集
shell 本身也是命令解释器,带有很多好用的工具如下:
$ tr # 转换
$ sed
$ awk
$ cut
$ find
$ grep
$ du # disk usage
$ df # disk free
$ ps
$ top
$ kill
$ killall
总结
本期,学习shell入门语法的结构化命令使用方法。
- 选择结构语法有if... then;...fi,case结构
- 逻辑结构语法有for、while、until结构
至此,我们对shell 入门语法也学习差不多了,在日常工作中,使用shell 脚本帮助我们实现部分自动化的工作
以上是本期内容,欢迎大佬们点赞评论,♥️~