一、Shell运算符
我们将Shell当成一门编程语言来学习,那么就一定需要有运算符 在Shell中,还存在 expr 表达式,可以用于做运算 在Shell中,运算需要使用 ((a b))或者[a b] 的形式
1.1 表达式expr
命令符 expr是对应基础的加减乘除操作识别,但是乘法和除法前面要加反斜杠 ‘’ ,并且运算符前后需要空格,如以下例子:
expr 10 5
expr 8 - 8
expr 2 * 5
expr 6 / 3
1.2 运算操作
但是如果有同学说我们想要把这个值赋给一个变量应该怎么写,简单,直接用$替换即可,用法如下:
a=$(expr 10 5)
a='expr 10 9' (×)
a=$((5 5))
a=$[5 8]
其中第二种方法相当于一个字符串了,linux并不会识别expr命令
1.3 操作实例
1、计算(3 8)*14的值
s=$[(3 8)*14]
2、创建 add.sh ,在执行的时候,通过传递参数的形式实现加法效果
#!/bin/bash sum=[1 2]echosum=sum
二、Shell条件判断
Shell中也有条件表达式,也就是比较两个值是否相等
2.1 基本语法
test 表达式 1 [ 表达式 ] 注意:中括号前后需要有空格
具体例子如下:
添加描述
2.2 值、权限、类型、多条件判断
在条件判断中,除了相等于不等的判断,还有一些其他的判断
两个值比较
文件权限判断
-r 有读的权限(read) -w 有写的权限(write) -x 有执行的权限(execute)
文件类型判断
-e 文件存在(existence) -f 文件存在并且是一个文件类型(file) -d 文件存在并且是一个目录类型(directory)
多条件判断
&& 与的关系,两者都成立 || 或的关系,两者有一个成立
温馨提示
&& 表示前一个条命令执行成功之后,在执行第二个条件 || 表示前一个条命令执行失败之后,再执行第二个条件 由此,我们可以衍生出来,类似三元运算符的形式
例如:加入我们想测试a是否等于b,如果等于则输出a=b,否则输出a!=b
[ a−eqb ] && echo 'a=b' || echo "a!=b"
三、Shell流程控制
流程控制语句是程序中的重点知识,掌握了流程控制语句,程序的基本架构就可以搭建起来了
3.1 if 流程语法
基本语法
if [ 条件判断 ];
then
语句
fi
# 或者下面这种
if [ 条件判断 ]
then
语句
fi
这只是单一的if,我们需要else的语法如下
if [ 条件判断 ]
then
语句
else
语句
fi
实例,比如说我们输入一个数,如果大于18则输出该岁数已经成年,反之则输出该岁数还未成年
#!/bin/bash
if [ $1 -gt 18 ]
then
echo '该岁数已经成年'
else
echo '该岁数还未成年'
fi
要是else if那种语法呢,语法结构如下:
代码语言:javascript复制 if [ 条件判断 ]
then
语句
elif [ 条件判断 ]
then
语句
else
语句
fi
实例:比如说我们输入一个数,小于18则输出未成年,大于等于18小于35则输出青年人,大于等于35小于60则输出壮年人,否则输出老年人
#!/bin/bash if [ 1−lt18]thenecho′未成年′elif[1 -lt 35 ] then echo '青年人' elif [
3.2 case 流程语法
if 如果遇到多个条件,写起来会很麻烦,可以使用 case 改写;语法结构如下:
代码语言:javascript复制 case $变量名 in
"值1")
语句
;;
"值2")
语句
;;
#...省略其他分支...
*)
语句
;;
esac
注意事项
case行结尾必须为单词"in",每一个模式匹配必须以右括号")"结束 双分号 ";;" 表示命令序列结束,相当于跳出当前判断语句 最后 "*)" 表示默认模式结尾,不符合最终的出口
例子:输入一个数,如果输入的是8,88,888则原样输出,否则输出为其他数字
#!/bin/bash case 1in"8")echo1;;"888")echo
3.3 for 流程语法
循环语句用于重复执行某个操作
for语句就是循环命令,可以指定循环的起点、终点和终止条件
不过for语句有两种不同写法,分别如下:
基本语法1:
for (( 初始值; 循环控制条件; 变量变化))
do
语句
done
例子:比如说我们想计算1到100的累和,实现如下:
#!/bin/bash
for(( i=0;i<=100;i ))
do
sum=i];
done
echo sum
基本语法2:
代码语言:javascript复制 for 变量 in 值1 值2 值3...
do
语句
done
#例子:列举出linux,windows,macos等操作系统
#!/bin/bash
for os in linux windows macos
do
echo $os
done
3.4 内部运算符
在shell中, {} 是内部运算符, {} 表示一个序列,例如,从1写到100:{1..100}
那么再用for的语法2来计算1-100的累和
#!/bin/bash for i in {1..100} do sum=[sum i]doneechosum
∗和@ ∗和@ 非常相似,都代表命令行所有的参数,但是 ∗把参数看成是一个整体,例如123456。而@ 把每个参数区分对待,例如换行显示
例如下面这个例子,将输入的数用上述两种方式输出体现出他们的区别:
#!/bin/bash echo "=====paramdoneecho"=====@"doecho
注意:在没有循环遍历时候,两者效果一致
3.5 while循环流程语法
循环语句除了 for 之外,还有一个 while 循环
基本语法
while [ 条件判断 ]
do
语句
done
例子:比如说我们输入一个数,然后输出从1到该数的累和
#!/bin/bash
a=1
while [ a−le1 ]
do
sum=[sum a]a=[a 1]
done
echo′1到′1’的累和为:‘
四、Shell读取控制台输入
读取控制台信息,既简单又很实用
基本语法
read 选项 参数
选项: -p:指定读取值时候的提示符 -t:指定读取值时候的等待时间(秒) 如果不添加 -t 表示一直等待 参数: 变量:指定读取值的变量名
例子如图:
假如我们让他只能等待两秒看看是否自动结束:
添加描述
OK,确实如此,最后你们看到那个t其实是没有的,是因为我点击光标出现的提示符,并不是我的输入。
五、Shell函数
函数的本质就是一段可以反复调用的代码块 在Shell中,函数细分为系统函数和自定义函数
5.1 系统函数
我们可以测试一些系统命令,例如使用率非常高的 date ,我们还可以获取时间戳 date %s 当我们需要打印写一些系统日志信息文件的时候,文件的命名规则通常在最后会添加上时间戳
温馨提示 这里我们使用的系统命令(或者系统函数) date %s 要进行命令替 换,也就是添加 $(date %s)
例子:比如说我们用一个脚本,输入一个参数,并以该参数加入时间戳赋予一个变量,并将该变量输出显示:
#!/bin/bash filename="
其实我们可以把所有的系统命令当成是系统函数来调用
basename 函数 basename 的作用是获取文件名称,它会删除所有的前缀包括最后一个"/"字符,然后将字符串显示出来
语法如下:
basename [string/pathname][suffix]
suffix为后缀,如果suffix被指定了,basename将会pathname或string中的suffix去掉,如下:
感觉这个函数其实就是获取文件名
现在我们回忆一下之前讲解的特殊变量 n,其中0 是获取当前名字,但是带有路径,我们只希望获取名字,所以可以通过 basename 去掉路径,甚至去掉后缀
看上图,就是可以成功获取到文件名字并且去除指定后缀
dirname函数 dirname 获取文件路径的绝对路径,从给定的包含绝对路径的文件名中去除文件名,然后返回剩余的路径
从上面这个图我们可以看得出这个函数注意就是将最后一个"/"及其后面的内容去掉,然后返回前面的内容
5.2 自定义函数
除了系统函数之外还有自定义函数,接下来我们看一下自定义函数如何实现
基本语法
代码语言:javascript复制 function 函数名(){
// 函数体
return 返回值
}
温馨提示
必须在调用函数之前,先声明函数 函数返回值可以通过 ?获取,但注意,? 的值范围是0~255
例子:实现一个两个数值相加的函数
上图,此时虽然实现了功能,但是如果此时用$?的话超于255的数就不正确了,因此我们可以用一个变量来存储返回值
#!/bin/bash function add(){
s=[1 2]
echo s
}
read -p "请输入第一个参数:" a
read -p "请输入第二个参数:" b
sum=(add a b)
echo"a b="
看上图我们可以知道,如果用return的话是无法获得返回值的,只能用echo。。。。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!