1 shell介绍
shell 是操作系统的最外层。shell 合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。
编写shell脚本, 只需要在一个能写文本内容的地方书写即可, 写完后无需编译, 直接运行处理, 但是需要解释器支持(只要在Linux运行, Linux自带了解释器)
目前Linux支持的shell的解释器
[root@node1 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
目前默认的解释器
[root@node1 ~]# echo $SHELL
/bin/bash
2 shell变量
shell命令中定义变量
含有用户变量、环境变量、特殊变量
用户变量定义如下:
变量名=值
注意事项:
1变量名不能以数字开头 可以是字母 下划线 , 同时在变量中支持 字母 下划线和数字
2- 变量的数据类型均为字符串
3- 在 等号的左右两边都不能有空格
4- 当变量的值有空格的时候, 需要使用单引号 或者 双引号包裹
5- 如果有一些特殊的字符, 可以使用 \ 进行转义
eg:定义变量
[root@node1 ~]# age=18
[root@node1 ~]# name=zhangsan
eg:获取变量
[root@node1 ~]# echo $age
18
[root@node1 ~]# echo $name
zhangsan
[root@node1 ~]# echo ${name}
zhangsan
eg:修改为只读变量
[root@node1 ~]# readonly age
[root@node1 ~]# age=20
-bash: age: 只读变量
eg:删除变量
[root@node1 ~]# unset name
[root@node1 ~]# echo ${name}
[root@node1 ~]#
特殊变量:
$0:当前程序的名称
$n:$1表示第一个参数,$2表示第二个参数,以此类推
$#:命令行参数的个数
$*:以”参数1 参数2 …"形式保存所有参数
eg:编写test01.sh脚本,内容如下:
支持接收外部参数,在脚本中,打印日历,定义一个变量,变量值为当前的时间,格式为yyyy-MM-dd HH:mm:ss,要求在脚本中打印参数的个数, 以及将传入的参数打印出来同时打印传入的第一个参数
涉及知识点:
shell脚本文件的后缀名: .sh
在shell脚本文件中第一行表示为默认的解释器, 一般固定为: #!/bin/bash
执行shell脚本方式有二种:
1、通过 sh 脚本文件 执行 shell脚本, 此方式不需要脚本拥有执行权限
2、通过 给shell脚本赋执行权, 然后直接输出脚本文件回车执行即可, 如: ./xxx.sh
eg:执行shell脚本
[root@node1 ~]# sh test01.sh 2000 2001 2002 2003
四月 2023
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
当前时间为:2023-04-27 19:56:26
共计传入参数个数为:4
所有参数内容为:2000 2001 2002 2003
第一个参数为:2000
3 shell字符串
shell中定义变量的时,默认都是字符串类型,定义字符串的时候, 字符串可使用单引号或双引号包裹, 也可以不要引号,建议在定义字符串的时候, 采用双引号包裹
单引号:将字符串的内容进行原样输出,认为所有的内容都是普通的字符
双引号:解析字符串中中特殊符号信息,如 $, 提取变量信息
4 shell 反引号的使用
反引号也称为飘号: 是指的在英文格式下, 在esc下面的键 `
作用:被反引号所包裹内容, 会被当做命令优先执行
5 shell中if语句
格式:
注意: 在if的中括号里面条件左右两边须有空格, 否则会报错
eg:当外部传入的参数个数为1个的时候, 输出参数只有一个, 否则返回参数不为一个
编写脚本
[root@node1 ~]# vim test02.sh
#!/bin/bash
if [ $# == 1 ]
then
echo "传入的参数只有一个"
else
echo "传入的参数不为一个"
fi
执行脚本
[root@node1 ~]# sh test02.sh
传入的参数不为一个
[root@node1 ~]# ^C
[root@node1 ~]# sh test02.sh 555
传入的参数只有一个
[root@node1 ~]# sh test02.sh 555 555
传入的参数不为一个
eg:创建一个脚本, 当脚本没有传入日期数据的时候, 脚本自动获取上一天的日期, 如果传入日期参数, 请设置为当前的日期
假设如果传入参数, 参数格式为 yyyy-MM-dd 输出的参数的格式也是 yyyy-MM-dd
编译shell脚本
[root@node1 ~]# vim test03.sh
#!/bin/bash
if [ $* == `date +'%Y-%m-%d'` ]
then
echo "$*"
else
echo `date -d '-1 day' +'%Y-%m-%d'`
fi
执行脚本
[root@node1 ~]# sh test03.sh 2023-04-27
2023-04-27
[root@node1 ~]# sh test03.sh 2024-04-26
2023-04-26
[root@node1 ~]#
eg:创建一个脚本, 当脚本没有传入日期数据的时候, 脚本自动获取上一天的日期, 如果传入日期参数, 请使用传入的日期
假设如果传入参数, 参数格式为 yyyy-MM-dd 输出的参数的格式也是 yyyy-MM-dd
将日期中的年 月 日 分别拿出来, 定义为用户变量, 并在脚本最后进行打印即可
编译shell脚本
[root@node1 ~]# vim test05.sh
#!/bin/bash
if [ $# == 1 ]
then
dateStr=$1
else
dateStr=`date -d '-1 day' +'%Y-%m-%d'`
fi
yearStr=`date -d"$dateStr" +'%Y'`
monthStr=`date -d"$dateStr" +'%m'`
dayStr=`date -d"$dateStr" +'%d'`
echo "年:"$yearStr
echo "月:"$monthStr
echo "日:"$dayStr
执行脚本
[root@node1 ~]# sh test05.sh 2023-03-12
年:2023
月:03
日:12