linux的学习(五):shell编程中的变量,运算符,条件判断

简介:

shell编程的基本概念,定义变量,运算符,条件判断的基本使用

shell编程

把多个命令写到一个文件里,这个文件就是脚本,里面还有很多的流程控制

基本概念

脚本的后缀名是.sh

脚本的执行:

  • sh+脚本的路径,bash+脚本的路径
  • 直接脚本的路径,但是需要权限
  • 文件名前面加.(点,后面加空格)或者source

简单例子

创建sh文件
bash 复制代码
touch c.sh
编辑文件

使用vim打开文件

bash 复制代码
vim c.sh
编辑内容:
bash 复制代码
#! /bin/bash
echo "hello world" 

注意,sh文件开头第一句都是#!/bin/sh:默认选择的命令行解析器

执行sh文件:

第一种方式:

bash 复制代码
bash c.sh

第二种方式:

bash 复制代码
./c.sh

如果直接打文件名,是不行的,要加上绝对路径或者相对路径才行

而且需要有文件的执行权限,如果提示权限不足,需要修改文件的权限。

bash 复制代码
chmod +x c.sh

注意 :第一种和第二种执行sh脚本文件是会开启一个子shell来执行的,有可能会不能对父shell起作用

第三种执行方式是直接在当前的shell中执行的

开不开子shell,区别是:环境变量的继承关系,如果在子shell中设置当前变量,父shell中是不可见的。

变量

变量根据定义分为:系统变量和用户自定义变量

根据作用范围分为:全局变量和局部变量,全局是所有的shell起效,局部是只针对当前shell起效

**扩展:**当前shell可以使用ps -f查看

开启一个子shell,bash,然后再执行ps -f,可以看到这个bash的PPID就是第一个bash的线程id

关于怎么知道当前的shell是哪个shell,可以看命令的PPID是哪个shell的进程号

可以使用exit退出当前的bash,回到上一级的bash(父bash)

查看全部的系统全局变量
bash 复制代码
env | less

也可以直接输出,echo $HOME

自定义变量

直接变量名=值 ,回车,不能有空格

更改也是直接变量名=值 ,回车,不用管值的类型的,默认都是string类型。

注意

  • 如果值是一个字符型,可以加引号
  • 这种直接赋值创建的是局部变量
把局部变量变成全局变量

export 变量名

但是使用这个命令,让子shell的局部变量变成了全局变量,虽然父shell可以访问到,但是在子shell中修改了这个变量的值,在父shell中,虽然还是可以访问到,但访问到的值不是修改后的值。

只读变量

只能读,不能修改,也就是不能重新赋值

bash 复制代码
readonly b=3
撤销变量

unset 变量名

这个命令不能撤销只读变量

特殊变量
${数字}

可以给脚本传递参数,写在脚本中,${0}是脚本的名称,所以传参使用的事1开始的。
vim d.sh编辑脚本

bash 复制代码
#! /bin/bash
echo "hello world" 
echo "hello, ${1}"

运行脚本的时候,传入参数

$#

获取输入参数的个数

可以用在循环或者是参数的判断

编辑脚本

bash 复制代码
#! /bin/bash
echo "--------------------特殊变量#-------------------"
echo $#

运行脚本

这个1就表示输入了一个参数

\*和 @

$*:表示命令行中所有的参数

$@:表示命令行中所有的参数

功能类似,区别在于 $ * 获得的参数是当成一个整体(相当于字符),@获得的参数是当成多个(相当于数组)。

$?

最后一次执行的命令的返回状态,0表示执行正常,非0表示错误。

它是直接在命令行使用的

运算符

定义的变量的值如果想做运算,可以使用((运算式))或者 [运算式]

脚本中计算

vim编辑add.sh脚本

bash 复制代码
#!/bin/sh
#!/bin/sh
sum=$[$1+$2]
echo sum=$sum

运行add.sh脚本

bash 复制代码
. add.sh 3 3

运行结果

流程控制

条件判断

第一种方式:test $a = 3

第二种方式:[ $a = 3 ]

然后使用echo $?,如果返回值为0,则相等,返回值为1,则不相等。

注意 :[ $a = 3 ],表达式前后都要有空格,等号两边也是要空格的,如果等号两边没有空格,会识别为一个变量名,如果里面随便输入值,也会判断为0,只有[]里面没有值的时候,才会判断为1。

常用的判断条件

整数的判断:

-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于

字符使用 = 判断相等,!= 判断不等

[ $a -lt 5 ]判断变量a是否小于5

文件权限的判断:

-r 有读的权限
-w 有写的权限
-x 有执行的权限


[ -x add.sh ]判断add.sh有没有读和执行的权限(上图中可以看到有读没有执行)

对文件类型进行判断

-e 文件是否存在
-f 文件是否存在并且是否是一个普通文件
-d 文件是否存在并且是否是一个目录

[ -d add.sh ] 判断add.sh是否是一个目录

多条件判断:

&&:前一条命令成功,才执行后面的命令

||:前一条命令失败,才执行后面的命令

例子:

bash 复制代码
 [ abcabc ] && echo "yes" || echo "no"
 [ ] && echo "yes" || echo "no"

运行结果:

相关推荐
dishugj2 小时前
【linux】Redhat 6.3系统安装zabbix-agent软件包,无法使用YUM源问题
linux·运维·zabbix
石像鬼₧魂石2 小时前
HexStrike-AI人工智能 渗透测试学习(Metasploitable2 192.168.1.4)完整流程总结
学习·ubuntu
非凡ghost2 小时前
MusicPlayer2(本地音乐播放器)
前端·windows·学习·软件需求
无奈笑天下2 小时前
【麒麟镜像vmtools异常排查指导书】
linux·运维·经验分享·云计算·kylin
Xの哲學2 小时前
Linux多级时间轮:高精度定时器的艺术与科学
linux·服务器·网络·算法·边缘计算
蓝桉~MLGT2 小时前
Ai-Agent学习历程—— 阶段1——环境的选择、Pydantic基座、Jupyter Notebook的使用
人工智能·学习·jupyter
QT 小鲜肉3 小时前
【Linux命令大全】001.文件管理之mmove命令(实操篇)
linux·服务器·前端·chrome·笔记
Winner13003 小时前
查看rk3566摄像头设备、能力、支持格式
linux·网络·人工智能
QT 小鲜肉4 小时前
【Linux命令大全】001.文件管理之mdel命令(实操篇)
linux·运维·服务器·chrome·笔记
杰米不放弃4 小时前
AI大模型应用开发学习-26【20251227】
人工智能·学习