Bash脚本基础
BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。
Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。
如何创建新shell脚本
- 创建包含bash命令的文本文件。文件的第一行应为:
#!/bin/bash ##解释器 - 使文件可执行(使用chmod +x scripts)
- 将文件放置在用户的$PATH的目录中
~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发、系统上的其他人使用的脚本
/usr/local/sbin - 本地开发、由root使用的脚本
直接运行脚本和使用source命令运行脚本是不同的!
引用和转义
(1)弱引用—-” ”
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外
[root@localhost mnt]# echo "date" ##显示date字符
date
[root@localhost mnt]# TIME=`date` ##``即$(),表示优先执行的命令,这里是给变量TIME定义
[root@localhost mnt]# echo "$TIME" ##显示TIME变量
Tue Jun 20 08:35:07 EDT 2017
[root@localhost mnt]# echo "`date`" ##显示当前时间
Tue Jun 20 08:35:29 EDT 2017
(2)强引用
将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展
[root@localhost mnt]# echo '`date`' ##显示`date`字符,这里``由于强引所以仅为字符
`date`
(3)转义
非引用的\是转义字符。它保留了下一个字符的文字值。
[root@localhost ~]# echo `date` ##没有转义的
Tue Jun 20 08:44:47 EDT 2017
[root@localhost ~]# echo \`date\` ##转义后的
`date`
Shell变量
shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变量的脚本。
!!!定义的变量一般为大写字母。
若要定义或指定值:
FRUIT=apple
若要参考或使用变量:
$FRUIT
${FRUIT}
[root@localhost ~]# TIME=`date` ##定义变量
[root@localhost ~]# echo $TIME ##使用变量
Tue Jun 20 08:49:19 EDT 2017
[root@localhost ~]# echo "the time is ${TIME}" ##使用变量
the time is Tue Jun 20 08:49:19 EDT 2017
算术运算符
算术运算符指的是可以在程序中实现加、减、乘、除等数学运算的运算符。
++ 增量后
– 减量后
- 减法
+ 加法
** 幂运算
* 乘法
/ 除法
% 余数
+= 加等
-= 减等
[root@localhost ~]# let A=1+2 ##加法
[root@localhost ~]# echo $A
3
[root@localhost ~]# let A=1-2 ##减法
[root@localhost ~]# echo $A
-1
[root@localhost ~]# let A=2*3 ##乘法
[root@localhost ~]# echo $A
6
[root@localhost ~]# let A=2**3 ##幂运算
[root@localhost ~]# echo $A
8
[root@localhost ~]# let A=10/5 ##除法
[root@localhost ~]# echo $A
2
[root@localhost ~]# let A=6%5 ##求余数
[root@localhost ~]# echo $A
1
[root@localhost ~]# let A+=1 ##A+=1即A=A+1(由上一步运算已知A=1)
[root@localhost ~]# echo $A
2
[root@localhost ~]# let A-=4 ##A-=4即A=A-4(由上一步运算已知A=2)
[root@localhost ~]# echo $A
-2
Shell计算命令
用$[]表示数学运算
用expr表示数学运算
用let指示数学运算
用(())表示数学运算。bash内建功能,效率高
[root@localhost ~]# echo $[2+4]
6
[root@localhost ~]# echo `expr 2*4`
2*4
[root@localhost ~]# echo `expr 1+2`
1+2
[root@localhost ~]# let A=2+4
[root@localhost ~]# echo $A
6
循环
for循环用于值列表中的相同命令的重复。
(1)
for 变量名 in 列表值
do
操作
done ##表示结束
[root@localhost ~]# for NUM in 1 hello 2 westos 3 lee;do echo $NUM;sleep 1 ;done ##这里sleep 1表示1秒执行一次
1
hello
2
westos
3
lee
(2)循环与计算的结合
for (())
do
done
这是一个类似C语言的for循环,它实现数值的读取以及数值的运算((数值起始;数值终止;数值运算))
[root@localhost ~]# for ((i=1;i<10;i++));do echo $i;done
1
2
3
4
5
6
7
8
9
脚本示例
test.sh主机检测
脚本test.sh实现检测主机是否在运行,是则显示up,否显示down
ping -c1 -w1 , -c1 表示ping的次数为1次,-w1表示结束次数
#!/bin/bash
for NUM in 172.25.254.{1..10};
do ping -c1 -w1 $NUM &>/dev/null && echo $NUM is up || echo $NUM is down
done
测试:
date.sh倒计时
date.sh
实现5秒的倒计时
#!/bin/bash
for ((i=5;i>0;i--))
do echo $i;
sleep 1;
done
测试:
time.sh倒计时
实现1分10秒的倒计时
1)分钟不变,秒–
2)分=0,秒=0,结束倒计时
3)分!=0,秒=0,分–,秒変59,秒–
#!/bin/bash
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
while [ "$SEC" -eq "0" -a "$MIN" -eq "0" ]
do
echo "Time is end "
exit 0
done
while [ "$SEC" -eq "0" ]
do
echo -n "after ${MIN}m${SEC}s is end"
sleep 1
echo -ne "\r \r"
((MIN--))
SEC=59
done
echo -n "after ${MIN}m${SEC}s is end "
echo -ne "\r \r"
sleep 1
done
测试:
conf.sh文件查找
查找/etc目录下以.conf结尾的文件,并复制到/etcconfig-当前时间 目录下
date +%F-%S ——%F表示full date; same as %Y-%m-%d,%S表示秒
#!/bin/bash
a=`date +%F-%S`
mkdir /etconfig-$a
cp /etc/*.conf /etconfig-$a
测试:
create_user.sh建立用户
根据/mnt/userfile建立用户
若用户存在则显示the user is existed
#!/bin/bash
for USER in `cat /mnt/username`
do
useradd $USER &>/dev/null && echo "successful" || echo "$USER is existed";
done
测试:
check_file文件存在确认
检测文件或目录的存在
#!/bin/bash
ls $1 &> /dev/null && echo "the $1 is existed" || echo "the file is not existed"
测试:
数据库备份
备份数据库并保存到相应目录,备份的文件要有时间戳,且显示文件的大小
#!/bin/bash
mkdir /mnt/dbdir &> /dev/null
for DB in `mysql -uroot -pwestos -e "show databases;" -N -E | grep -E '\*|schema$' -v`
do
echo "Backing up $DB"
mysqldump -u root -pwestos $DB > /mnt/dbdir/$DB-`date +%F`.sql
done
for DBDUMB in /mnt/dbdir/*
do
SIZE=`stat --print "%s\n" $DBDUMB`
echo ""
echo "$DBDUMB's size is $SIZE"
done
测试: