Shell
shell是一种脚本语言 可以使用逻辑判断、循环判断等语句; 可以自定义函数; shell是系统命令的集合,比如Windows的批处理命令; shell脚本可以实现自动化运维,能打打增加我们的运维效益;
shell脚本结构
开头必须加#!/bin/bash 也就是调用/bin/bash的内核运行 脚本的名字以.sh结尾,用来区分是一个shell脚本;
执行方法有两种:
1.作为可执行程序
chmod +x 1.sh //使脚本具有执行权限
./1.sh //当前目录下执行脚本
2.作为解释器参数
bash 1.sh
查看脚本执行过程:bash -x 1.sh 查看脚本是否语法错误:bash -n 1.sh
date日期命令
年月日:
命令:date +%Y-%m-%d [root@jinkai ~]# date +%Y-%m-%d
2020-10-27
命令:date +%F [root@jinkai ~]# date +%F
2020-10-27
命令:date +%y-%m-%d [root@jinkai ~]# date +%y-%m-%d
20-10-27
命令:date +%Y%m%d
[root@jinkai ~]# date +%Y%m%d
20201027
时间时分秒:
命令:date +%H:%M:%S [root@jinkai ~]# date +%H:%M:%S
17:25:38
命令:date +%T [root@jinkai ~]# date +%T
17:25:52
周(星期):
命令: date +%w
查询当天是星期几(0是星期日,1-6是星期一到星期六)
[root@jinkai ~]# date +%w
2
命令:date -d 20120316 +%w
查询某年某月某日当天是星期几
[root@jinkai ~]# date -d 20120316 +%w
5 命令:date +%W
查询当前是今年第几周
[root@jinkai ~]# date +%W
43
时间戳:
命令:date +%s
从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)
[root@jinkai ~]# date +%s
1603791361
命令:date -d @1603791361
根据时间戳查询日期时间
[root@jinkai ~]# date -d @1603791361
2020年 10月 27日 星期二 17:36:01 CST
增加减少年月日:
命令:date -d "+1day"
显示后一天的日期
[root@jinkai ~]# date -d "+1day"
2020年 10月 28日 星期三 17:38:52 CST 命令:date -d "-1 day"
显示前一天的日期
[root@jinkai ~]# date -d "-1day"
2020年 10月 26日 星期一 17:39:02 CST 命令:date -d "-1 month"
显示一个月前的日期时间
[root@jinkai ~]# date -d "-1 month"
2020年 09月 27日 星期日 17:40:48 CST
命令:date -d "-1 min"
显示一分钟前的时间日期
[root@jinkai ~]# date -d "-1 min"
2020年 10月 27日 星期二 17:40:10 CST
变量
命名规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线 _,不能使用标点符号。 不能使用bash里的关键字(可用help命令查看保留关键字)。
shell数值:
a=1;b=2;
给变量a赋予数值1,变量b赋予数值2,c=$(($a+$b)) 或c=$[$a+$b]
c=a+b,使用运算必须前面加$
[root@jinkai ~]# a=1
[root@jinkai ~]# b=2
[root@jinkai ~]# c=$(($a+$b))
[root@jinkai ~]# echo $c
3
[root@jinkai ~]# c=$[$a+$b]
[root@jinkai ~]# echo $c
3
shell字符串:
字符串时shell变成中最常用最有用的数据类型(数字和字符串),字符串可以用单引号,也可以用双引号;
单引号(无法使用转义符和变量):
[root@jinkai ~]# str='this is a string'
[root@jinkai ~]# echo $str
this is a string
双引号(可以有变量,可以出现转义符):
[root@jinkai ~]# aa="abc$4"
[root@jinkai ~]# echo $aa
abc$4
反引号:
反引号可以将命令结果传递给变量
[root@jinkai ~]# n=wc -l /etc/passwd
[root@jinkai ~]# echo $n
19 /etc/passwd
$:
调用变量值必须在前面带$符号
引用某个命令的结果时,用变量替代 n=wc -l /etc/passwd
写和用户交互的脚本时,变量也是必不可少的
read -p "Input a number: " n
echo $n
如果没写这个n,可以直接使用$REPLY
[root@jinkai ~]# read -p "Input a number: " n
Input a number: 20
[root@jinkai ~]# echo $n
20
[root@jinkai ~]# read -p "Input a number: "
Input a number: 100
[root@jinkai ~]# echo $REPLY
100
内置变量 $0, $1, $2… $0表示脚本本身,$1 第一个参数,$2 第二个 .... $#表示参数个数
vim a.sh #!/bin/bash
echo "$1=$1"
echo "第二个参数$2"
echo "第三个参数$3"
echo "总共几个参数$#"
[root@jinkai shell]# sh a.sh 1 2 4 a
$1=1
第二个参数2
第三个参数4
总共几个参数4
逻辑判断if
-gt :大于 -lt :小于 -eq :等于 -ne :不等于 -ge :大于或等于 -le :小于或等于
格式1:
if 条件 ;then 语句; fi
a=5
if [ $a -gt 3 ]; then echo ok; fi
一行表示出来,注意条件中间都要有空格,有空格;分号用来隔开;
或者
a=5
if [ $a -gt 3 ]
then
echo ok
fi
意思:定义a=5,判断a大于3的时候,就输出ok;
格式2:
if 条件 ;then 语句1 ; else 语句2;fi 语句1为满足条件的语句,语句2为不满足条件的语句;
a=1
if [ $a -gt 3 ]; then echo ok; else echo echo "no ok" ; fi
输出:no ok
或者
#!/bin/bash
a=1
if [ $a -gt 3 ]
then
echo ok
else
echo "no ok"
fi
格式3:
if 条件1;then 语句1;elif 条件2;then 语句2;else 语句3;fi 当条件1不满足时,就行条件2判断,条件2不满足就执行语句3;
#!/bin/bash
a=2
if [ $a -lt 1 ]; then echo "a<1"; elif [ $a -lt 3 ]; then echo "a<3 && a>1"; else echo "a>3"; fi
输出:a<3 && a>1
这语句意思是:判断a小于1,就输出a<1;如果a大于1,就进行第二个判断a小于3,如果大于1,小于3,就输出a<3 && a>1;两个条件都不满足就输出a>3
或
#!/bin/bash
a=2
if [ $a -lt 1 ]
then
echo "a<1"
elif [ $a -lt 3 ]
then
echo "a>1 && a<3"
else
echo "a>3"
fi
变量与变量判断:
判断变量a与b哪个比较大
a=1
b=2
if [ $a -lt $b ]; then echo "a<b"; else echo "a>b"; fi
输出:a<b
多条件判断:
&&:表示and,并且 || :表示or,或者
a=1
b=2
if [ $a -lt 5 ] && [ $b -lt 5 ]; then echo "a<5 && b<5"; fi
输出:a<5 && b<5
或者if [ $a -lt 5 -a $b -lt 5 ]; then echo "a<5 && b<5"; fi
两个条件改成一个[ ]里面,中间加-a 表示 &&,同理 || 等于 -o
文件目录属性判断
[ -f file ]:判断是否是普通文件,且存在 [ -d file ]:判断是否是目录文件夹,且存在 [ -e file ]:判断文件或目录是否存在 [ -r file ]:判断文件是否可读,判断r [ -w file ]:判断文件是否可写,判断w [ -x file ]:判断文件是否可执行,判断x
#!/bin/bash
#判断/tmp/abc 是否存在,且为普通文件,则输出file。反之,不存在则重新创建一个abc文件
f="/tmp/abc"
if [ -f $f ]
then
echo file
else
touch $f
fi
#!/bin/bash
#判断f是否是目录,不是目录且不存在就创建,是目录且存在就提示“目录存在”,存在且不是目录就会告错
f="/tmp/abc"
if [ -d $f ]
then
echo 目录存在
else
mkdir $f
fi
#!/bin/bash
#判断这个文件或者目录是否存在,存在则输出yes 不存在则输出no
f="/tmp/abc"
if [ -e $f ]
then
echo $f is yes
else
echo $f is no
fi