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