对于简单的需求,shell比python好,语法简单
一 什么是shell script
将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.
再加上些智能(条件/流控)控制,就变成了智能化脚本了.
系统变量
set和env的区别
set:显示所有变量
env:环境变量
[root@www ~]# xxxxxx=1
[root@www ~]# set |grep xxxx
xxxxxx=1
[root@www ~]#
要取消abd的赋值,就用unset,因为set保存了。
[root@www ~]# abd=value
[root@www ~]# echo $abd
value
[root@www ~]# unset abd
[root@www ~]# echo $abd
[root@www ~]#
常用系统变量
PATH
PWD
LANG
HOME
HISTSIZE
PS1
IFS
域分隔符 是空格,换行,TAB键的合集
part6 全局变量与局部变量
[root@www ~]# HISTSIZE=2
[root@www ~]# history
172 HISTSIZE=2
173 history
[root@www ~]#
Profile上面就有HISTSIZE=1000
[root@www ~]# vim /etc/profile
HISTSIZE=1000
\u是用户名,\h是hostname, \W是所在目录
[root@www ~]# echo $PS1
[\u@\h \W]\$
[root@www ~]#
母函数和子函数,母函数能用到子函数上,但是子函数(局部变量)不会用到母函数上
[root@www ~]# export money=10000
[root@www ~]# echo $money
10000
[root@www ~]# bash
[root@www ~]# echo $money
10000
[root@www ~]# export mon=200
[root@www ~]# exit
exit
[root@www ~]# echo $mon
[root@www ~]#
取第3行第2个
[root@www ~]# free
total used free shared buff/cache available
Mem: 999696 261084 387380 7400 351232 555268
Swap: 2097148 0 2097148
[root@www ~]# free |awk ‘NR==3{print $2}‘
2097148
[root@www ~]#
运算符号:
[root@u ~]# ((2<10))
[root@u ~]# echo $?
0
[root@u ~]#
如果想用[],要查man test
STRING1 != STRING2
the strings are not equal
INTEGER1 -eq INTEGER2
INTEGER1 is equal to INTEGER2
-eq表示==
-lt表示小于
-gt 表示大于
-a表示&&
-o表示||
-ge表示大于等于
-le表示小于等于
-ne表示不等于
例子:
[root@u ~]# [ 2 -eq 10 ]
[root@u ~]# echo $?
1
[root@u ~]# [ 2 -eq 2 ]
[root@u ~]# echo $?
0
[root@u ~]#
2小于等于10
[root@u ~]# [ 2 -le 10 ]
[root@u ~]# echo $?
0
[root@u ~]#
赋值:
[root@u ~]# x=7
[root@u ~]# y=$x
[root@u ~]# echo $x
7
[root@u ~]# echo $y
7
[root@u ~]#
数学运算要在[]内
[root@u ~]# x=2
[root@u ~]# x=$[$x+1]
[root@u ~]# echo $x
3
[root@u ~]#
最好用下面的方法:直观
[root@u ~]# echo $x
4
[root@u ~]# ((x=x+1))
[root@u ~]# echo $x
5
[root@u ~]#
这样也行:
[root@u ~]# x=1
[root@u ~]# ((x+=1))
[root@u ~]# echo $x
2
[root@u ~]#
如果自增1的话,可以用++
[root@u ~]# i=0
[root@u ~]# ((i++))
[root@u ~]# echo $i
1
[root@u ~]#
自减1,--
[root@u ~]# x=1
[root@u ~]# echo $((x+=1))
2
[root@u ~]#
Shell的所有计算器
$[]
(())
expr
[root@u ~]# expr 1 + 2
3
[root@u ~]#
[root@u ~]# x=1
[root@u ~]# y=2
[root@u ~]# expr $x + $y
3
[root@u ~]#
[root@u ~]# a=`expr $x + $y`
[root@u ~]# echo $a
3
[root@u ~]#
上面都只取整数
[root@u ~]# expr 99 / 134
0
[root@u ~]#
要是除数结果有小数点,就要安装BC软件包
[root@u ~]# yum install bc -y
保留两位小数
[root@u ~]# echo ‘scale=2;30/1000‘|bc -l
.03
[root@u ~]#
找使用率
[root@u ~]# free
total used free shared buff/cache available
Mem: 999696 306920 214848 7384 477928 487236
Swap: 2097148 0 2097148
计算小数要用双引号
[root@u ~]# total=`free | awk ‘NR==2{print $2}‘`
[root@u ~]# echo $total
999696
[root@u ~]# use=`free | awk ‘NR==2{print $3}‘`
[root@u ~]# echo $use
307648
[root@u ~]# echo "scale=2;$use/$total"|bc -l
.30
[root@u ~]#
如果要输出百分比,就要取以.做分割cut -d.,取第2个,再加%
[root@u ~]# echo "scale=2;$use/$total"|bc -l|cut -d. -f2
30
[root@u ~]# b=`echo "scale=2;$use/$total"|bc -l|cut -d. -f2`
[root@u ~]# echo $b%
30%
[root@u ~]# echo ${b}%
30%
[root@u ~]#
part5-1、测试文件状态
-d 测试目录是否存在
[root@u ~]# test -d /etc
[root@u ~]# echo $?
0
[root@u ~]# [ -d /etc ]
[root@u ~]# echo $?
0
[root@u ~]#
-e文件
[root@u ~]# [ -e /root/a.txt ]
[root@u ~]# echo $?
0
[root@u ~]#
-s 文件长度 > 0、非空(文件存在且非空)
[root@u ~]# [ -s /etc/passwd ]
[root@u ~]# echo $?
0
-f 正规文件(普通文件)
-w 可写
-r 可读
-x 可执行
[root@u ~]# [ -w /etc/passwd ]
[root@u ~]# echo $?
0
[root@u ~]# [ -r /etc/passwd ]
[root@u ~]# echo $?
0
[root@u ~]# [ -x /etc/passwd ]
[root@u ~]# echo $?
1
[root@u ~]# ll -d /etc/passwd
-rw-r--r--. 1 root root 2225 11月 16 23:22 /etc/passwd
当前用户是否具有可读可写可执行权限
[root@u ~]#
-L 符号连接
-u 文件有 suid 位设置
-h连接文件
[root@u ~]# ln -s /root/abg.txt /tmp/
[root@u ~]# ll /tmp/abg.txt
lrwxrwxrwx 1 root root 13 12月 9 22:53 /tmp/abg.txt -> /root/abg.txt
[root@u ~]# [ -h /tmp/abg.txt ]
[root@u ~]# echo $?
0
[root@u ~]#
part5-2、字符串测试
= 两个字符串相等
!= 两个字符串不相等
-z 空串
-n 非空串
[root@u ~]# x=‘hello‘
[root@u ~]# y=‘hello‘
[root@u ~]# [ -z $x ]
[root@u ~]# echo $?
1
[root@u ~]# [ -n $x ]
[root@u ~]# echo $?
0
[root@u ~]# [ $x = $y ]
[root@u ~]# echo $?
0
[root@u ~]# [ $x != $y ]
[root@u ~]# echo $?
1
[root@u ~]#
[root@MiWiFi-R3-srv ~]# var1=‘abc‘
[root@MiWiFi-R3-srv ~]# var2=‘123‘
[root@MiWiFi-R3-srv ~]# [ $var1 == $var2 ]
[root@MiWiFi-R3-srv ~]# echo $?
1
part5-3、测试数值
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
建一个脚本:写脚本判断文件是什么文件
[root@u ~]# mkdir /test
mkdir: 无法创建目录"/test": 文件已存在
[root@u ~]# cd /test
[root@u test]# ls
a.txt b.txt c.txt d.txt gaizhujiming.sh root.txt son
[root@u test]#
[root@u test]# vim 1.sh
[root@u test]# cat 1.sh
# !/bin/bash
var=‘/etc/passwd‘
if [ -f $var ]
then
echo "$var is regular file"
elif [ -b $var ]
then
echo "$var is block"
elif [ -d $var ]
then
echo "$var is direcotry"
elif [ -h $var ]
then
echo "$var is symlink"
else
echo "$var is unkown"
fi
[root@u test]#
[root@u test]# chmod +x 1.sh
[root@u test]# ./1.sh
/etc/passwd is regular file
[root@u test]#
修改var的赋值,得到:
[root@u test]# cat 1.sh
# !/bin/bash
var=‘/etc/passwd‘
var=‘/dev/sda‘
var=‘/etc‘
var=‘sdf‘
if [ -f $var ]
then
echo "$var is regular file"
elif [ -b $var ]
then
echo "$var is block"
elif [ -d $var ]
then
echo "$var is direcotry"
elif [ -h $var ]
then
echo "$var is symlink"
else
echo "$var is unkown"
fi
[root@u test]#
[root@u test]# vim 1.sh
[root@u test]# ./1.sh
/dev/sda is block
[root@u test]# vim 1.sh
[root@u test]# ./1.sh
/etc is direcotry
[root@u test]# ./1.sh
sdf is unkown
[root@u test]#
把1.sh是全部信息和权限都复制到2.sh
[root@u test]# cp -a 1.sh 2.sh
[root@u test]#
如果想不打开文件,直接修改脚本就要:
[root@u test]# vim 1.sh
[root@u test]# cat 1.sh
# !/bin/bash
read -p ‘please input your file paht:‘ var
if [ -f $var ]
then
echo "$var is regular file"
elif [ -b $var ]
then
echo "$var is block"
elif [ -d $var ]
then
echo "$var is direcotry"
elif [ -h $var ]
then
echo "$var is symlink"
else
echo "$var is unkown"
fi
[root@u test]#
输入,就可以自动得到结果:
[root@u test]# ./1.sh
please input your file paht:/etc
/etc is direcotry
[root@u test]#
[root@u test]# ./1.sh
please input your file paht:/etc/passwd
/etc/passwd is regular file
[root@u test]#
如果不要./的话,就用整个目录,如:
[root@u test]# /test/1.sh
please input your file paht:/root
/root is direcotry
[root@u test]#
[root@u test]# vim 4.sh
脚本意思是取第1、2、3、4、5、10个数
[root@u test]# cat 4.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
echo $5
echo ${10}
[root@u test]#
[root@u test]# ./4.sh
-bash: ./4.sh: 权限不够
[root@u test]# chmod +x 4.sh
先执行看看:
[root@u test]# ./4.sh
[root@u test]#
[root@u test]# ./4.sh a b c e u y zz 1 2 3 4 5
a
b
c
e
u
3
[root@u test]#
如果想直接在./2.sh后面直接写var要输入的值,可以这样写:
[root@u test]# cat 2.sh
# !/bin/bash
echo $1
if [ -f $var ]
then
echo "$var is regular file"
elif [ -b $var ]
then
echo "$var is block"
elif [ -d $var ]
then
echo "$var is direcotry"
elif [ -h $var ]
then
echo "$var is symlink"
else
echo "$var is unkown"
fi
[root@u test]#
[root@u test]# ./2.sh /etc
/etc
is regular file
[root@u test]#
Is前面没有路径,需要加上,于是用vim 2.sh然后按esc后输入::%s /var/1/g,就可以把var变成1
# !/bin/bash
echo $1
if [ -f $var ]
then
echo "$var is regular file"
elif [ -b $var ]
then
echo "$var is block"
elif [ -d $var ]
then
echo "$var is direcotry"
elif [ -h $var ]
then
echo "$var is symlink"
else
echo "$var is unkown"
fi
~
~
:%s /var/1/g
[root@u test]# ./2.sh /etc
/etc
/etc is direcotry
[root@u test]#
放到/usr/bin,就可以在任何一个文件夹运行2.sh
[root@u test]# cp 2.sh /usr/bin/
[root@u test]# cd
[root@u ~]# 2.sh /etc
/etc
/etc is direcotry
[root@u ~]#
如果放到profile中,就是永久保存
如果把脚本写到终端上,就要用分号
[root@u ~]# x=1
[root@u ~]# if [ $x -eq 1 ];then echo ‘x is 1‘;fi
x is 1
[root@u ~]#
[root@u test]# cat 5.sh
#test.sh
echo $0
echo $1
echo $2
echo $3
echo ${11}
echo ‘$$‘ $$
echo ‘$*‘ $*
echo ‘$@‘ $@
echo ‘$#‘ $#
echo ‘$?‘ $?
[root@u test]#
[root@u test]# ./5.sh 1 2 3 4 5 6 7 8 9 10 11
./5.sh ($0就是./5.sh)
1
2
3
11
$$ 2236 (进程号,kill -9 2236就会杀掉,如果要睡眠10000秒,就sleep 10000)
$* 1 2 3 4 5 6 7 8 9 10 11
$@ 1 2 3 4 5 6 7 8 9 10 11
$# 11 (多少个参数)
$? 0 ($# 11这个执行成功没有)
[root@u test]#
查看nginx的状态:
[root@u test]# systemctl status nginx
开启:systemctl start nginx
写一个脚本,看是否正在启动nginx,如果没,就开启
红色这行的干扰项,需要去掉,用grep -v ‘grep‘
[root@u test]# ps aux | grep nginx
root 925 0.0 0.2 122808 2080 ? Ss 12月11 0:00 nginx: master process /usr/sbin/ngin
nginx 927 0.0 0.3 125324 3524 ? S 12月11 0:00 nginx: worker process
root 2587 0.0 0.0 112676 980 pts/0 R+ 00:00 0:00 grep --color=auto nginx
[root@u test]# ps aux | grep nginx | grep -v ‘grep‘
root 925 0.0 0.2 122808 2080 ? Ss 12月11 0:00 nginx: master process /usr/sbin/nginx
nginx 927 0.0 0.3 125324 3524 ? S 12月11 0:00 nginx: worker process
[root@u test]#
[root@u test]# vim ningx_check.sh (名字不能带nginx,否则脚本的语句判断出错)
[root@u test]# cat ningx_check.sh
#!/bin/bash
ps aux | grep nginx | grep -v ‘grep‘
if [ $? -ne 0 ]
then
systemctl start nginx
fi
[root@u test]# chmod +x ningx_check.sh
[root@u test]# systemctl stop nginx
[root@u test]# systemctl status nginx
[root@u test]# ./ningx_check.sh
[root@u test]# systemctl status nginx
[root@u ~]# var=10
[root@u ~]# awk -v x=$var ‘{print x}‘ b.txt
10
10
10
10
10
10
10
10
10
10
[root@u ~]#