一 什么是shell script
将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令,再加上些智能(条件/流控)控制,就变成了智能化脚本了。
二 变量
part1 为何要有变量
程序的运行就是一些列状态的变量->用变量值的变化去表示
part2 变量命名规则
以字母或下划线开头,剩下的部分可以是:字母、数字、下划线.
最好遵循下述规范:
1.以字母开头
2.使用中划线或者下划线做单词的连接
3.同类型的用数字区分
4.对于文件最好加上拓展名 例如: sql_bak.tar.gz,log_bak.tar.bz2
part3 系统变量
set 显示所有变量
env 环境变量
part4 变量赋值
varname=value
echo $varname
删除变量 unset varname
part5 常用系统变量
PATH
PWD ccho $PWD查看位置
LANG
HOME
HISTSIZE echo $HISTSIZE 查看限制保存历史记录的条数
vim /etc/profile 修改保存限制保存历史记录的条数
HISTSIZE = 800
PS1 定义linux界面命令行每行前面的格式
IFS
域分隔符 是空格,换行,TAB键的合集
part6 全局变量与局部变量
export money=1000 定义一个全局变量
爹子辈的全局变量子字辈可以用
子字辈的全局变量爹字辈不能用
part7 定义变量名的边界
[root@MiWiFi-R3-srv ~]# rest_mem=20
[root@MiWiFi-R3-srv ~]# echo ${rest_mem}%
20%
part 8 数据类型
bash中的变量无须声明,拿来就用.默认的变量都会是字符类型,还可以有数字类型,普通的脚本,这两种类型够用了
运算符
part1 算术运算符
+
-
*
/
%
$[ ]进行数学运算
part2 关系操作
<
>
<=
>=
==
!=
&&
||
[ ] 在括号内进行关系比较,要用-gt大于,-ge 大于等于,-eq等于,-le小于等于,-lt小于,-ne不等于,同test
-gt is greater than,
-ge is greater than or equal to,
-eq is equal to,
-le is less than or equal to,
-lt is less than,
-ne is not equal to
!取反,-a和,-o或
(())在括号内进行关系比较,要用<,>,<=,>=
part3 赋值运算符
=
+=
*=
/=
%=
part4 shell里的所有计算器
$[] y=$[$x+1] echo y
(()) ((y=x+1)) echo y
$(()) echo $((y=x+1)) 直接将计算结果输出
expr expr $x +$y 直接输出结果
浮点运算
先装bc包 yum install bc -y
echo "scale=2;30/1000" | bc -l 保存两位小数
part5 测试操作
命令执行后会返回到一个系统变量中 $?
如果$?值为0 表示命令执行成功 否则为失败
part5-1、测试文件状态
-d 文件存在,是一个目录 test -d /etc
-s 文件存在,还是一个非空文件
-e 文件存在
-f 文件存在,是一个普通文件
-h或者L 文件存在,是一个链接文件
-w 文件存在,当前用户有写权限
-r 文件存在,当前用户有读权限
-x 文件存在,当前用户有执行权限
part5-2、字符串测试
= 两个字符串相等
!= 两个字符串不相等
-z 空串
-n 非空串
part5-3、测试数值
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
四 流程控制
part1分支结构
if [条件]
then
elif [条件]
then
else [条件]
then
fi
#!/bin/bash #指定解释器 var='/etc/init.d' if [ -d $var ] then echo "$var is directory" elif [ -b $var ] then echo "$var is block" elif [ -f $var ] then echo "$var is regular file" else echo 'unknow' fi
写完脚本,给执行权限chmod +x
./ 脚本文件 执行脚本
向脚本传递参数
#test.sh echo $0 #取文件名
echo $1 echo $2 echo $3 echo ${11} #传递参数的第十一个参数 echo '$$' $$ #脚本运行的ID号
echo '$*' $* echo '$@' $@ echo '$#' $#
#总共有多少个参数 echo '$?' $? ''' 测试:python test.sh 1 2 3 4 5 6 7 8 9 10 11 输出结果: ./test.sh 1 2 3 11 $$ 14312 $* 1 2 3 4 5 6 7 8 9 10 11 $@ 1 2 3 4 5 6 7 8 9 10 11 $# 11 $? 0 '''
在文本中命令行模式,%s /aaa/bbb/g #将文件中的aaa全部改为bbb
将脚本拷贝到/usr/bin下,在任何位置直接脚本名就可以运行,如果要固化,就要在/etc/profile内改路径
ps aux |grep nginx |grep -v 'grep' 过滤nginx,然后把本身的grep命令产生的nginx过滤掉
part2 循环结构
part2-1 while循环
while (条件)
do
动作
done
需要无限循环时我们会选择while :
#!/bin/bash var1=AAA var2=BBB var3=CCC while : do clear echo -e "A:${var1} B:${var2} C:${var3}" #-e 将 换行输出 temp=$var1 var1=$var2 var2=$var3 var3=$temp sleep 1 done
part2-2 for循环
ping -c1 192.168.16.188 ping一次这个IP地址
ping -c1 192.168.16.188 &> /dec/null ping后的显示结果扔进黑洞文件
检查内网存活的IP #!/bin/bash for i in {1..254} doping -c1 192.168.16.$i &> /dev/null
if [ $? -ne 0 ]
then
echo "192.168.16.$i is available"
else
echo "192.168.16.$i is unavailable" &> /dev/null done
part2-3 case语句
case $uname in root) #判断uname是否匹配root
echo "welcome $uname" ;; #执行结束
seker) echo "welcome $uname" ;; default) echo "welcome $uname" ;; *) #全部没匹配成功
echo "no user $uname" esac
函数
交互shell中的函数
function abc(){ echo 'aaa'; echo 'bbbb'; } abc #调用
脚本中的函数
1.函数定义
shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数
定义函数的格式:
function-name (){
command1
........
}
或 function function-name(){ #函数名前面多了个function关键字
command1
........
}
2.函数调用
以下是一个函数的脚本实例:
#!/bin/bash
#hello
function hello(){ #声明函数
echo "Hello!" #函数的主体,输出"Hello!"
} #函数结束
hello #调用函数
3.参数传递
向函数传递参数就像在脚本是使用变量位置$1,$2,$3...$9
以下是一个传递参数的实例:
#!/bin/bash
#hellofun
function hello(){
echo "Hello! The first parameter is '$1'."
}
hello good
#该脚本执行的结果是: Hello! The first parameter is 'good'.
4.函数文件
保存函数的文件,用以上的例子写成一个函数文件如下:
#!/bin/bash
#hellofunction
function hello(){
echo "Hello!"
return 1
}
上面的hellofunction文件就是一个函数文件,可通过另一个脚本来调用
#!/bin/bash
#hellof
. hellofunction#注意点和hellofunction之间有个空格
hello
5.载入和删除
用set查看已载入的函数
用unset function-name 取消载入
举例如下:
#!/bin/bash
#hellof
. hellofunction
unset hello
hello #因为已经取消载入。。所以会出错
6.函数返回状态
#!/bin/bash
#hellofun
function hello(){
echo "Hello! The first parameter is '$1'."
return 1
}
hello
echo $?#输出返回的状态值(一般成功是返回0,其它值为失败)