目录
⛳️推荐
编写Shell脚本
编写简单的脚本
接收用户的参数
判断用户的参数
⛳️推荐
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站
编写Shell脚本
Shell脚本命令的工作方式有下面两种。
交互式(Interactive):用户每输入一条命令就立即执行。
批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。
通过查看SHELL变量可以发现,当前系统已经默认使用Bash作为命令行终端解释器
[root@localhost ~]# echo $SHELL
/bin/bash
编写简单的脚本
查看当前所在工作路径并列出当前目录下所有的文件及属性信息,第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本;第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,第三、四行的可执行的Linux命令。
[root@localhost ~]# vim example.sh
#! /bin/bash
#for example by weihongbin
pwd
ls -alh
[root@localhost ~]# bash example.sh
/root
total 2.1G
dr-xr-x---. 17 root root 4.0K Nov 15 14:05 .
dr-xr-xr-x. 18 root root 254 Nov 8 15:40 ..
-rw-r--r--. 1 root root 560M Nov 8 15:53 560
也可以用./
来执行bash文件
接收用户的参数
Linux系统中的Shell脚本语言内设了用于接收参数的变量,变量之间使用空格间隔,
对应的是当前
脚本程序的名称,0对应的是当前Shell脚本程序的名称,0对应的是当前Shell脚本程序的名称,#对应的是总共有几个参数,
对应的是所有位置的参数值,∗对应的是所有位置的参数值,*对应的是所有位置的参数值,?对应的是显示上一次命令的执行返回值,而
、1、1、2、$3……则分别对应着第N个位置的参数值
[root@localhost ~]# vim example.sh
#! /bin/bash
#for example by weihongbin
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第1个参数为$1,第5个为$5。"
[root@localhost ~]# bash example.sh one two three four five six
当前脚本名称为example.sh
总共有6个参数,分别是one two three four five six。
第1个参数为one,第5个为five。
判断用户的参数
按照测试对象来划分,条件测试语句可以分为4种:
文件测试语句;
逻辑测试语句;
整数值比较语句;
字符串比较语句。
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符
文件测试所用参数
操作符 | 作用 |
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
使用文件测试语句来判断/etc/fstab是否为一个目录类型的文件,然后通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着它不是目录,这个目录不存在:
[root@localhost ~]# [ -d /etc/fstab ]
[root@localhost ~]# echo $?
1
再使用文件测试语句来判断/etc/fstab是否为一般文件,如果返回值为0,则代表文件存在,且为一般文件:
[root@localhost ~]# [ -f /etc/fstab ]
[root@localhost ~]# echo $?
0
Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断/dev文件是否存在,若存在则输出Exist字样
[root@localhost ~]# [ -e /dev ] && echo "Exist"
Exist
Linux系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量USER来判断当前登录的用户是否为非管理员身份:
[root@localhost ~]# [ $USER = root ] || echo "user"
[root@localhost ~]# su - centos8
Last login: Wed Nov 15 10:38:34 CST 2023 on tty2
[centos8@localhost ~]$ [ $USER = root ] || echo "user"
user
Linux系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值,判断当前用户是否为一个非管理员的用户。由于判断结果因为两次否定而变成正确,因此会正常地输出预设信息:
[root@localhost ~]# [ ! $USER = root ] || echo "administrator"
administrator
&&是逻辑“与”,只有当前面的语句执行成功的时候才会执行后面的语句。
||是逻辑“或”,只有当前面的语句执行失败的时候才会执行后面的语句。
!是逻辑“非”,代表对逻辑测试结果取反值;之前若为正确则变成错误,若为错误则变成正确。
先判断当前登录用户的USER变量名称是否等于root,然后用逻辑“非”运算符进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户。最后若条件成立,则会根据逻辑“与”运算符输出user字样;若条件不满足,则会通过逻辑“或”运算符输出root字样,而只有在前面的&&不成立时才会执行后面的||符号。
[root@localhost ~]# [ ! $USER = root ] && echo "user" || echo "root"
root
使用规范的整数比较运算符来进行操作。
可用的整数比较运算符
操作符 | 作用 |
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
使用free -m命令查看内存使用量情况(单位为MB),然后通过“grep Mem:”命令过滤出剩余内存量的行,再用awk '{print $4}'命令只保留第4列。
[root@localhost ~]# free -m | grep Mem:
Mem: 1790 1139 87 33 563 465
[root@localhost ~]# free -m | grep Mem: | awk '{print $4}'
86
输出结果赋值给一个变量,以方便其他命令进行调用:
[root@localhost ~]# freemem=`free -m | grep Mem: | awk '{print $4}'` && echo $freemem
86
使用整数运算符来判断内存可用量的值是否小于1024,若小于则会提示“Insufficient Memory”(内存不足)的字样:
[root@localhost ~]# [ $freemem -lt 1024 ] && echo "Insufficient Memory"
Insufficient Memory
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。
常见字符串比较运算符
操作符 | 作用 |
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
通过判断String变量是否为空值,进而判断是否定义了这个变量:
[root@localhost ~]# [ -z $String ] && echo $?
0
当前语系的环境变量值LANG不是英语(en.US)时,则会满足逻辑测试条件并输出“Not en.US”(非英语)的字样:
[root@localhost ~]# [ ! $LANG = "en.US" ] && echo "Not en.US"
Not en.US