【小知识】shell脚本入门三,结构化命令

529 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

前言

shell 是程序设计语言之一,相比起其他高级语言来说比没有那么强大,但俗话说“麻雀虽小,五脏俱全”,高级语言有的基本功能,shell也有,比如函数、结构化语法像if...else,while等

我们已经学习对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 n2equal
n1 -ge n2great or equal
n1 -gt n2great than
n1 -le n2less or equal
n1 -lt n2less than
n1 -ne n2not equal

2.2 字符串比较

比较描述
str1 = str2str1是否等于str2
str1 != str2str1是否不等于str2
str1 < str2str1小于str2
str1 > str2str1大于str2
-n str1str1的长度是否不为0
-z str1str1的长度是否为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 file2equal
file1 -ot file2equal

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格式说明

  1. 具体的值

    in 关键字后面可以直接给出具体的值,多个值之间以空格分隔,如 10 20 30"hello" "jue" "jin"

for var in 10 20 30
do
       echo $var
done
  1. 取值范围

    • 可以直接使用{start..end}

    • start 表示起始值、end 表示终止值

    • 中间用两个点号相连

for var in {A..z}
do
       echo $var
done
  1. 使用命令执行结果

使用反引号``或者$()都可以取得命令的执行结果

sum=0

for var in $(seq 2 2 100)
do
    ((sum+=n))
done

echo $sum
  1. 使用shell通配符

shell 通配符被认为一种简化的正则表达式

通常用来匹配目录或者文件,而不是文本

for file in *.txt
do
    echo $file
done
  1. 特殊变量

我们之间在函数中了解到,一些特殊的变量:

$#:表示输入参数的个数
$*:把所有命令行参数当作整体
$@:获取传入的参数数组,用于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 脚本帮助我们实现部分自动化的工作

以上是本期内容,欢迎大佬们点赞评论,♥️~