个人学习笔记,如有错误,欢迎大家指出!
一.Shell脚本命令的工作方式
1.交互式 Interactive.:
用户每输入一条命令就立即执行
2.批处理 Batch.:
由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令
二.脚本的编写
使用Vim编辑器把Linux命令按照顺序依次写入到一个文件中,这就是一个简单的脚本了
示例:
**作用:**查看当前所在工作路径并列出当前目录下所有的文件及属性信息
- 脚本名称:
- 可以随意
- 建议加上
.sh
后缀,以便于区分
- 脚本声明:
-
#!/bin/bash
- 告诉系统使用哪种Shell解释器来执行该脚本
-
- 注释信息 #.:
-
#For Example BY linuxprobe.com
- 对脚本功能和某些命令的介绍信息
-
- 可执行语句:
-
pwd
和ls -al
- 就是平时执行的Linux命令
-
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al
三.脚本的运行
1.用bash解释器命令直接运行
格式:bash 命令
root@honestliu-Standard:~# bash test.sh
/root
总计 64
drwx------ 10 root root 4096 11月 9 21:52 .
drwxr-xr-x 20 root root 4096 11月 3 22:35 ..
-rw------- 1 root root 2457 11月 9 21:39 .bash_history
-rw-r--r-- 1 root root 3106 10月 17 2022 .bashrc
.....................省略.........................
2.输入完整路径来执行
默认会因为权限不足而提示信息。需要赋予权限
chmod u+x *.sh
格式:路径/*.sh
root@honestliu-Standard:~# ./test.sh
bash: ./test.sh: 权限不够
root@honestliu-Standard:~# chmod u+x test.sh
root@honestliu-Standard:~# ./test.sh
/root
总计 64
drwx------ 10 root root 4096 11月 9 21:52 .
drwxr-xr-x 20 root root 4096 11月 3 22:35 ..
-rw------- 1 root root 2457 11月 9 21:39 .bash_history
-rw-r--r-- 1 root root 3106 10月 17 2022 .bashrc
.....................省略.........................
四.接收用户的参数
脚本程序能够像之前执行命令时那样,接收用户输入的参数。
1.脚本语言接收参数的变量
参数 | 作用 |
---|---|
$0 |
当前Shell脚本程序的名称 |
$# |
总共传入了几个参数 |
$* |
显示所有位置的参数值 |
$? |
显示上一次命令的执行返回值 |
$1、$2、$3... |
对应着第N个位置的参数值 |
例子:
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第1个参数为$1,第5个为$5。"
[root@linuxprobe ~]# sh example.sh one two three four five six
当前脚本名称为example.sh
总共有6个参数,分别是one two three four five six。
第1个参数为one,第5个为five。
五.判断用户参数
1.判断结果的返回
Shell脚本中的条件测试语法可以判断表达式是否成立
- 若条件成立则返回数字0
- 否则便返回其他随机数值。
2.条件测试语句的执行格式
3.条件判断的分类
- 文件测试语句
- 逻辑测试语句
- 整数值比较语句
- 字符串比较语句。
(1)文件判断
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符
表4-3 文件测试所用的参数
运算符 | 作用 |
---|---|
-d |
测试文件是否为目录类型 |
-e |
测试文件是否存在 |
-f |
判断是否为一般文件 |
-r |
测试当前用户是否有权限读取 |
-w |
测试当前用户是否有权限写入 |
-x |
测试当前用户是否有权限执行 |
**例子:**判断/etc/fstab是否为一个目录类型的文件
如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在
[root@linuxprobe ~]# [ -d /etc/fstab ]
[root@linuxprobe ~]# echo $?
1
(2)逻辑判断
I.逻辑判断“与”
运算符号:&&
**含义:**表示当前面的命令执行成功后才会执行它后面的命令
**例子:**判断/dev/cdrom文件是否存在,若存在则输出Exist字样
[root@linuxprobe ~]# [ -e /dev/cdrom ] && echo "Exist"
Exist
IV.逻辑判断“或”
运算符号:||
**含义:**表示当前面的命令执行失败后才会执行它后面的命令
**例子:**用来结合系统环境变量USER来判断当前登录的用户是否为非管理员身份
[root@linuxprobe ~]# echo $USER
root
[root@linuxprobe ~]# [ $USER = root ] || echo "user"
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ [ $USER = root ] || echo "user"
user
III.逻辑判断“非”
运算符号:!
**含义:**表示把条件测试中的判断结果取相反值(将true变成flase)
**例子:**假设现在是管理员用户的身份,再判断当前用户是否为一个非管理员的用户,结果受逻辑判断“非”的影响,本应该是true的结果被转成flase结果了,但后面却接了个“或”逻辑判断。由于判断结果因为两次否定而变成正确,因此会正常地输出预设信息:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe root]# [ ! $USER = root ] || echo "administrator"
administrator
(3)整数值比较
注意事项:
日常对于整数值判断中的符号和命令符相冲突
例如:等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。
- 仅是对数字的操作,不能将数字与字符串、文件等内容一起操作
- 不能想当然地使用日常生活中的等号、大于号、小于号等来判断
表4-4 可用的整数比较运算符
运算符 | 作用 |
---|---|
-eq |
是否等于 |
-ne |
是否不等于 |
-gt |
是否大于 |
-lt |
是否小于 |
-le |
是否等于或小于 |
-ge |
是否大于或等于 |
**例子1:**判断10是否大于10以及10是否等于10(通过输出的返回值内容来判断)
[root@linuxprobe ~]# [ 10 -gt 10 ]
[root@linuxprobe ~]# echo $?
1
[root@linuxprobe ~]# [ 10 -eq 10 ]
[root@linuxprobe ~]# echo $?
0
(4)字符串比较运算符
表4-5 常见的字符串比较运算符
运算符 | 作用 |
---|---|
= |
比较字符串内容是否相同 |
!= |
比较字符串内容是否不同 |
-z |
判断字符串内容是否为空 |
**例子:**通过判断String变量是否为空值,进而判断是否定义了这个变量
[root@linuxprobe ~]# [ -z $String]
[root@linuxprobe ~]# echo $?
0