1 shell 脚本
1.1 概述
shell 解析器
[root@CentOS8 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
# 注:脚本以"#!/bin/bash"开头,用于指定解析器为 "/bin/bash";因为有的系统默认解析器不是这个
# 入门脚本样例,内容为缩进部分
[root@CentOS8 tmp]# vi hello.sh
#!/bin/bash
echo "hello"
[root@CentOS8 tmp]# sh hello.sh
hello
shell 中的变量
-
常用的系统变量
$HOME
、$PWD
、$SHELL
、$USER
等# 样例 echo $HOME echo $PWD echo $SHELL echo $USER
-
自定义变量
- 变量定义规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
- 等号两侧不能有空格
- 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要使用双引号或单引号括起来
- 基于语法
- 定义变量:
变量=值
- 撤销变量:
unset 变量
- 声明静态变量:
readonly 变量
(注意:不能 unset)
- 定义变量:
- 变量定义规则
-
特殊变量
$n
:n 为数字,$0
代表该脚本名称,$1-$9
代表第一到第九个参数;十以上的参数需要用大括号包含,如${10}
$#
:获取所有输入参数个数,常用于循环$*
:代表命令行中所有的参数,$*
把所有的参数看成一个整体$@
:也代表命令行中所有的参数,不过$@
把每个参数区分对待$?
:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一 个命令正确执行;如果这个变量的值为非0(具体是哪个数由命令自己来决定),则证明 上一个命令执行不正确了
# $* 与 $@ 区别 # (1) $* 与 $@ 都表示传递给函数或脚本的所有参数,不被双引号""包含时,都以$1 $2 …$n的形式输出所有参数 # (2) 当它们被双引号""包含时,"$*"会将所有的参数作为一个整体,以“$1 $2 …$n” 的形式输出所有参数;"$@"会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数 # 编写脚本(内容为缩进部分) [root@CentOS8 tmp]# vi mytest.sh echo "----------无双引号遍历结果----------" for i in $* do echo "I love $i" done for j in $@ do echo "I love $j" done echo "----------有双引号遍历结果----------" for i in "$*" do echo "I love $i" done for j in "$@" do echo "I love $j" done # 测试结果 [root@CentOS8 tmp]# sh mytest.sh java c shell ----------无双引号遍历结果---------- I love java I love c I love shell I love java I love c I love shell ----------有双引号遍历结果---------- I love java c shell I love java I love c I love shell
运算符
-
基本语法
$((运算式))
或$[运算式]
expr +,-,\*,/,%
,加、减、乘、除、取模运算。注:expr 运算符间要有空格
-
样例
[root@CentOS8 ~]# expr 2+3 # 由结果可知,2+3中间要有空格,否则原样输出 2+3 [root@CentOS8 ~]# expr 2 + 3 # 加 5 [root@CentOS8 ~]# sum=$((2+3)) # $((运算式)) 方法 [root@CentOS8 ~]# echo $sum 5 [root@CentOS8 ~]# expr 2 - 3 # 减 -1 # 计算 (2+3)*4 [root@CentOS8 ~]# expr `expr 2 + 3` \* 4 # expr 表达式方式 20 [root@CentOS8 ~]# result=$[(2+3)*4] # $[运算式] 方法 [root@CentOS8 ~]# echo $result 20
条件判断
-
基本语法:
[ condition ]
。注意事项如下condition
前后要有空格- 条件非空即为 ture。如 [ aaa ] 返回true,[] 返回 false
-
常用判断条件
-
两个整数之间比较
命令 说明 = 字符串比较 -lt (less than) 小于 -le (less equal) 小于等于 -eq (equal) 等于 -gt (greater than) 大于 -ge (greater equal) 大于等于 -ne (not equal) 不等于 -
按照文件权限进行判断
命令 说明 -r (read) 有读的权限 -w (write) 有写的权限 -x (execute) 有执行的权限 -
按照文件类型进行判断
命令 说明 -e (existence) 文件存在 -f (file) 文件存在并且是一个常规的文件 -d (directory) 文件存在并且是一个目录 -
多条件判断
&&
表示前一条命令执行成功时,才执行后一条命令||
表示上一条命令执行 失败后,才执行下一条命令
-
-
样例
# 23是否大于等于22 [root@CentOS8 tmp]# [ 23 -ge 22 ] [root@CentOS8 tmp]# echo $? # 由上文可知,$?=0表示正常,非0不正常 0 # hello.sh 是否具有写权限 [root@CentOS8 tmp]# [ -w hello.sh ] [root@CentOS8 tmp]# echo $? 0 # aaa.txt 和 bbb.txt 是否存在(由下面结果可知前者存在后者不存在) [root@CentOS8 tmp]# [ -e /tmp/aaa.txt ] [root@CentOS8 tmp]# echo $? 0 [root@CentOS8 tmp]# [ -e /tmp/bbb.txt ] [root@CentOS8 tmp]# echo $? 1 # 多条件判断样例 [root@CentOS8 tmp]# [ condition ] && echo ok || echo notOk ok [root@CentOS8 tmp]# [ condition ] && [ ] || echo notOk notOk
read 读取控制台输入
-
语法:
read [选项] [参数]
- 选项:
-p
指定读取值时的提示符;-t
指定读取值时等待的时间(秒);-n
指定读入有效字符的数个 - 参数:
变量
指定读取值的变量名
- 选项:
-
样例
[root@CentOS8 tmp]# vi read.sh #!/bin/bash read -t 5 -p "enter your name in 5s " NAME echo $NAME [root@CentOS8 tmp]# sh read.sh enter your name in 5s zhangsan zhangsan
函数用法
-
系统函数
-
basename [string/pathname] [suffix]
,basename 命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来。选项 suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。 -
dirname 文件绝对路径
,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分) -
样例
[root@CentOS8 tmp]# touch /usr/local/a.txt [root@CentOS8 tmp]# basename /usr/local/a.txt a.txt [root@CentOS8 tmp]# basename /usr/local/a.txt .txt a [root@CentOS8 tmp]# dirname /usr/local/a.txt /usr/local
-
-
自定义函数
-
语法
[ function ] funname[()] { Action; [return int;] } funname # 经验技巧 # (1) 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译 # (2) 函数返回值,只能通过$?系统变量获得,可以显示加 return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)
-
样例
# 需求1:计算两个输入参数的和 [root@CentOS8 tmp]# vi sum1.sh #!/bin/bash function sum(
-