Shell 运算符及语法结构

目录

一、Shell运算符

[1.1 表达式expr](#1.1 表达式expr)

[1.2 运算操作](#1.2 运算操作)

[1.3 操作实例](#1.3 操作实例)

二、Shell条件判断

[2.1 基本语法](#2.1 基本语法)

[2.2 值、权限、类型、多条件判断](#2.2 值、权限、类型、多条件判断)

三、Shell流程控制

[3.1 if 流程语法](#3.1 if 流程语法)

[3.2 case 流程语法](#3.2 case 流程语法)

[3.3 for 流程语法](#3.3 for 流程语法)

[3.4 内部运算符](#3.4 内部运算符)

[3.5 while循环流程语法](#3.5 while循环流程语法)

四、Shell读取控制台输入

五、Shell函数

[5.1 系统函数](#5.1 系统函数)

[5.2 自定义函数](#5.2 自定义函数)


一、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]

echo sum=$sum

二、Shell条件判断

Shell中也有条件表达式,也就是比较两个值是否相等

2.1 基本语法

test 表达式 1

[ 表达式 ] 注意:中括号前后需要有空格

具体例子如下:

2.2 值、权限、类型、多条件判断

在条件判断中,除了相等于不等的判断,还有一些其他的判断

两个值比较

表达式 含义 表达式 含义

-eq 等于(equal) -ne 不等于(not equal)

-lt 小于(less than) -le 小于等于(less equal)

-gt 大于(greater than) -ge 大于等于(greater equal)

文件权限判断

-r 有读的权限(read)

-w 有写的权限(write)

-x 有执行的权限(execute)

文件类型判断

-e 文件存在(existence)

-f 文件存在并且是一个文件类型(file)

-d 文件存在并且是一个目录类型(directory)

多条件判断

&& 与的关系,两者都成立

|| 或的关系,两者有一个成立

温馨提示

&& 表示前一个条命令执行成功之后,在执行第二个条件

|| 表示前一个条命令执行失败之后,再执行第二个条件

由此,我们可以衍生出来,类似三元运算符的形式

例如:加入我们想测试a是否等于b,如果等于则输出a=b,否则输出a!=b

[ $a -eq b \] \&\& 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那种语法呢,语法结构如下:

if [ 条件判断 ]

then

语句

elif [ 条件判断 ]

then

语句

else

语句

fi

实例:比如说我们输入一个数,小于18则输出未成年,大于等于18小于35则输出青年人,大于等于35小于60则输出壮年人,否则输出老年人

#!/bin/bash

if [ $1 -lt 18 ]

then

echo '未成年'

elif [ $1 -lt 35 ]

then

echo '青年人'

elif [ $1 -lt 60 ]

then

echo '壮年人'

else

echo '老年人'

fi

3.2 case 流程语法

if 如果遇到多个条件,写起来会很麻烦,可以使用 case 改写;语法结构如下:

case $变量名 in

"值1")

语句

;;

"值2")

语句

;;

#...省略其他分支...

*)

语句

;;

esac

注意事项

case行结尾必须为单词"in",每一个模式匹配必须以右括号")"结束

双分号 ";;" 表示命令序列结束,相当于跳出当前判断语句

最后 "*)" 表示默认模式结尾,不符合最终的出口

例子:输入一个数,如果输入的是8,88,888则原样输出,否则输出为其他数字

#!/bin/bash

case $1 in

"8")

echo $1

;;

"88")

echo $1

;;

"888")

echo $1

;;

*)

echo '其他数字'

esac

3.3 for 流程语法

循环语句用于重复执行某个操作

for语句就是循环命令,可以指定循环的起点、终点和终止条件

不过for语句有两种不同写法,分别如下:

基本语法1:

for (( 初始值; 循环控制条件; 变量变化))

do

语句

done

例子:比如说我们想计算1到100的累和,实现如下:

#!/bin/bash

for(( i=0;i<=100;i++ ))

do

sum=\[sum+$i];

done

echo $sum

基本语法2:

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]

done

echo $sum

$* 和 $@

$* 和 $@ 非常相似,都代表命令行所有的参数,但是 $* 把参数看成是一个整体,例如 123 456 。而 $@ 把每个参数区分对待,例如换行显示

例如下面这个例子,将输入的数用上述两种方式输出体现出他们的区别:

#!/bin/bash

echo "=====$*====="

for param in "$*"

do

echo $param

done

echo "=====$@====="

for paprm in "$@"

do

echo $paprm

done

注意:在没有循环遍历时候,两者效果一致

3.5 while循环流程语法

循环语句除了 for 之外,还有一个 while 循环

基本语法

while [ 条件判断 ]

do

语句

done

例子:比如说我们输入一个数,然后输出从1到该数的累和

#!/bin/bash

a=1

while [ $a -le $1 ]

do

sum=\[sum+$a]

a=\[a+1]

done

echo '1到'1'的累和为:'sum

四、Shell读取控制台输入

读取控制台信息,既简单又很实用

基本语法

read 选项 参数

选项:

-p:指定读取值时候的提示符

-t:指定读取值时候的等待时间(秒) 如果不添加 -t 表示一直等待
参数:

变量:指定读取值的变量名

例子如图:

假如我们让他只能等待两秒看看是否自动结束:

OK,确实如此,最后你们看到那个t其实是没有的,是因为我点击光标出现的提示符,并不是我的输入。

五、Shell函数

函数的本质就是一段可以反复调用的代码块

在Shell中,函数细分为系统函数和自定义函数

5.1 系统函数

我们可以测试一些系统命令,例如使用率非常高的 date ,我们还可以获取时间戳 date +%s

当我们需要打印写一些系统日志信息文件的时候,文件的命名规则通常在最后会添加上时间戳

温馨提示

这里我们使用的系统命令(或者系统函数) date +%s 要进行命令替

换,也就是添加 $(date +%s)

例子:比如说我们用一个脚本,输入一个参数,并以该参数加入时间戳赋予一个变量,并将该变量输出显示:

#!/bin/bash

filename="1_log_(date +%s)"

echo $filename

其实我们可以把所有的系统命令当成是系统函数来调用

basename 函数

basename 的作用是获取文件名称,它会删除所有的前缀包括最后一个"/"字符,然后将字符串显示出来

语法如下:

basename [string/pathname][suffix]

suffix为后缀,如果suffix被指定了,basename将会pathname或string中的suffix去掉,如下:

感觉这个函数其实就是获取文件名

现在我们回忆一下之前讲解的特殊变量 $n ,其中 $0 是获取当前名字,但是带有路径,我们只希望获取名字,所以可以通过 basename 去掉路径,甚至去掉后缀

看上图,就是可以成功获取到文件名字并且去除指定后缀

dirname函数

dirname 获取文件路径的绝对路径,从给定的包含绝对路径的文件名中去除文件名,然后返回剩余的路径

从上面这个图我们可以看得出这个函数注意就是将最后一个"/"及其后面的内容去掉,然后返回前面的内容

5.2 自定义函数

除了系统函数之外还有自定义函数,接下来我们看一下自定义函数如何实现

基本语法

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=" $sum

看上图我们可以知道,如果用return的话是无法获得返回值的,只能用echo。。。。

相关推荐
Jason-河山14 分钟前
【自动化更新,让商品信息跳舞】——利用API返回值的幽默编程之旅
运维·自动化
饮浊酒18 分钟前
Linux操作系统 ------(3.文本编译器Vim)
linux·vim
lihuhelihu26 分钟前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算
哲讯智能科技28 分钟前
SAP Business One市场价格解析
运维·sap·erp
矛取矛求1 小时前
Linux系统性能调优技巧
linux
山东布谷科技官方1 小时前
布谷直播源码部署服务器关于数据库配置的详细说明
运维·服务器·数据库·直播系统源码·直播源码·直播系统搭建·直播软件开发
One_Blanks1 小时前
渗透测试-Linux基础(1)
linux·运维·安全
Perishell1 小时前
无人机避障——大疆与Airsim中的角速度信息订阅获取
linux·动态规划·无人机
爱吃喵的鲤鱼1 小时前
linux进程的状态之环境变量
linux·运维·服务器·开发语言·c++
dessler1 小时前
Linux系统-ubuntu系统安装
linux·运维·云计算