1.创建脚本
#!/bin/bash ##脚本第一行,用/bin/bash执行
echo "hello world" ##执行的命令
* /usr/local/bin 本地开发、系统上的其他人使用的脚本
* /usr/local/sbin 本地开发、由root使用的脚本
2.脚本的执行和调试
3.引用和转义
* 在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致 按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
echo "can i have a $FRUIT"
* 弱引用,将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量扩展和命令扩展在双引号内仍起作用。
echo ‘can i have a $FRUIT‘
* 强引用,将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展
* 转义,非引用的\是转义字符。它保留了下一个字符的文字值。
4.shell变量
* 用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变量的脚本
FITST=jhon ##定义变量
echo ${FIRST}_$LAST ##使用变量
5.命令替换
* 在子shell中执行指定命令并用命令输出替换脚本中的命令替换。
6.算术运算符
* 可以在程序中实现加、减、乘、除等数学运算的运算符。
- 减法
+ 加法
** 幂运算
* 乘法
/ 除法
% 余数
i++ 增量后
i-- 减量后
+= 加等
-= 减等
## 脚本内容表示从1到10之和
运行结果
7.for循环
* 用于值列表中的相同命令的重复。
## (seq 2 2 8)表示从2到8隔两个数取数
8.循环与计算结合
** 表示从1加到99的总和
结果
9.数据库备份示例
#!/bin/bash
for DB in $(mysql -uroot -p123 -e "show databases;" -E -N | grep -v ‘^*‘ | grep -v ‘schema$‘) //过滤要备份的数据库
do
echo "Backup $DB" //显示Backup 库名
mysqldump $DB > /dbbackup/$DB.dump //备份数据库到dbbackup目录
done
echo "OK" //备份完成后显示OK
for DBDUMP in /dbbackup/* //从dbbackup目录中过滤库名
do
SIZE=$(stat --printf "%s\n" $DBDUMP) //统计备份文件大小
echo "$DBDUMP $SIZE" //显示库名和大小
done
10.位置参数
* 使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量,为交互式输入
测试
* 使用位置参数来读取传递给脚本的命令行参数或选项输入。各种特殊变量存储传递的选项编号。
指定的位置参数总数:$#
位置参数自身:$0、$1、$2、$3....
所有位置参数: [email protected]、$*
测试
11.退出状态
* Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。
echo $? ##退出状态的值被存储在"?"中,查看退出状态
* 退出状态数字的含义
0 ##在指定的文件中找到了模式
1 ##在指定的文件中未找到模式
>1 ##一些其他错误(无法打开文件、错误的搜索表达式等)
12.test条件判断
* test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语法,使用方括号"[]"将表达式括起来,这样更易于阅读。
* 非零或零长度字符串运算符
[ -n westos];echo $? ##判断不是非零字符,也可写为test -n westos;echo $?
[ -z westos];echo $? ##判断是非零字符
* 字符串比较运算符
= ##等于字符
!= ##不等于字符
* 数字比较运算符
-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于大于
* 文件状态运算符
测试
-b ##块设备文件
-c ##字符设备文件
-e ##文件是否存在
-f ##是否是常规文件
-d ##是否是目录
-S ##套接字文件
-L ##是否是链接
* 二进制文件运算符
-ef ##两文件是否相同
-nt ##第一个文件是否比第二个新
-ot ##第一个文件是否比第二个旧
* 逻辑运算符
-a ##并且,两个条件同时满足
-o ##或者,两个条件最少满足任意一个
! ##给结果取反
&& ##结果正确执行
|| ##结果不正确执行
13.if语句
* if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之间的命令列表(反向平写if,标记if块的结束)。
#!/bin/bash
if
[ -z "$1" ] //脚本后没跟文件
then
echo please give me file //显示please give me file
elif
[ ! -e "$1" ] //如果脚本后跟的文件不存在
then
echo "$1 is not exist" //显示文件is not exist
else
for NAME in `cat $1` //从文件中过滤NAME
do
USER=`getent passwd $NAME` //检测用户是否存在
if
[ -z "$USER" ] //如果用户不存在
then
useradd $NAME //添加用户
echo wsetos | passwd --stdin $NAME //并设置密码
else
echo $NAME is exist //显示用户存在
fi
done
fi //结束
* 测试
14.case语句
* 它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码。esac标记结束
#!/bin/bash
case "$2" in
+) //第二个变量为+
echo num=$[ $1 + $3 ] //输出$1 + $3的值
;;
-) //第二个变量为-
echo num=$[ $1 - $3 ] //输出$1 - $3的值
;;
%) //第二个变量为%
echo num=$[ $1 * $3 ] //输出$1 % $3的值
;;
/) //第二个变量为/
echo num=$[ $1 / $3 ] //输出$1 / $3的值
;;
*) //第二个变量为其他
echo "please input right command" //输出please input right command
;;
esac
* 测试
15.expect语句
* 实现自动应答脚本。
交互输入脚本
## 使用expect脚本之前要yum install expect -y
expect脚本
#!/user/bin/expect //告诉操作系统脚本里的代码使用那一个shell来执行。
set timeout 10 //设置后面所有的expect命令的等待响应的超时时间,单位为秒
spawn /mnt/ask.sh //spawn是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令。
expect "who" //判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回。
send "haha\r" //执行交互动作,相当于手工输入"westos"。
expect "old"
send "13\r"
expect "happy"
send "happy\r"
expect eof //作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果。
## interact表示执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录。
* 测试
16.环境变量
* shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些变量我们称之为环境变量,分为三种
(1) 临时设置,换了shell后不存在
(2) 用户级别设置,相对应的用户一直生效,切换用户后不生效
修改~./bash_profile文件
* 测试
(3)系统级别修改,切换用户后也会生效
修改/etc/profile文件
* 测试
(4) env ##查看环境变量
17.别名
* 自定义属于自己的系统命令。
(1) 临时生效
alias xie = ‘vim‘ ##临时设置别名
alias ##查看别名
(2) 永久生效
修改~./ bashrc文件
* 测试
source ./ bashrc ##文件生效
(3) 删除别名
unalias xie
18.函数
#!/bin/bash
ACTION () { //设置函数
if [ $2 $1 ];then //判断条件
echo "$1 is $3"
fi
}
ACTION $1 "! -e" ‘not exist’ //使用函数
ACTION $1 "-b" ‘not exist’
ACTION $1 "-f" ‘not exist’
ACTION $1 "-L" ‘not exist’
ACTION $1 "-d" ‘not exist’
ACTION $1 "-c" ‘not exist’
ACTION $1 "-s" ‘not exist’