linux学习 shell脚本
shell脚本
一、脚本
1.脚本:记录命令
2.shell:linux中的解释器,将命令解释给内核。所以shell脚本只能在shell中运行。
二、.脚本创建及编写格式如下:
1. vim 文件名.sh
编辑内容:
#!/bin/bash ##表示以下所有内容的解释器是/bin/bash
命令
:wq
2.chmod +x 文件名.sh ##给执行权限
3.sh 文件名.sh ##以绝对路径执行脚本,sh 指定执行器是/bin/bash
文件名.sh ##执行脚本
4.sh -x 文件名.sh ##调试
或在脚本中如下格式进行编辑:
#!/bin/bash -x
5.ps f ##可以查看使用的解释器
三、批处理
1.定义变量:用一个固定字符表示不度固定的值。
如:a=1;则$a表示变量
$ ##表示取值
` ` ##表示先执行该命令
\ ##转义单个字符
如:\$a ##此处的$只表示字符$
'' ##转义所有字符
" " ##弱转义,不能转义!,$,\,`,即该变量扩展和命令扩展在""内仍是起作用的
注:""及' '分布采取就近原则,即与距离最近的构成以对""或''
2.循环定义变量,格式如下:
for NUM in 1 hello 2 westos 3 redhat;
##变量NUM依次=1 hello 2 westos 3 redhat
for NUM in {1..10}
##连续定义变量NUM
for NUM in `seq 1 2 10`
##间断定义变量NUM ,从1定义到10,每2个定义一次
for NUM in `seq 2 2 10`
##间断定义变量NUM ,从2定义到10,每2个定义一次
3.命令替换
命令替换在子shell中执行指定命令并用命令输出替换脚本中的命令替换
例:编辑脚本,将/etc/*.conf文件拷贝至/mnt/replace,且有时间戳
4.shell计算命令
[ 算式 ] 如:[ 2 + 3 ]
- ##减法;+ ##加法;** ##幂运算;* ##乘法运算;
/ ##除法运算;% ##取余运算
++ ##自加运算; -- ##自减运算
例:
expr 算式
如:expr 2 + 3
expr 2 '*' 3 ##乘法运算
注:expr不能使用’**’即幂运算
例:
let a=算式 ##定义变量,直接计算
echo $a ##显示变量
例:
四、while...do语句
例:编写脚本,实现倒计时1分10秒
五、编辑脚本--备份数据库,显示备份的文件大小及时间戳
#!/bin/bash
BACKUP=mariadb-`date +%Y-%m-%d-%s`
touch /mnt/$BACKUP ##创建带有时间戳的文件
for DB in `mysql -uroot -e "showdatabases;" -E -N | grep -E '\*|schema&' -v`
##定义变量
do
echo "Backing up $DB"
mysqldump $DB > /mnt/$BACKUP
done
for DBNAME in `ls /mnt/DB_BACK/*`
do
SIZE=`stat --print "%s\n" $DBNAME`
echo ${DBNAME}\'s size is $SIZE byte
done
六、位置参数
1.位置参数:脚本以外且未在脚本名中出现的其他字符
2.read:交互式定义参数值
格式:read 参数名 [enter]
参数值 [enter]
read -p "提示语" -s 参数名 [enter]
参数值 [enter]
##-p表示可以有提示语;-s表示不换行
3.用位置参数来传递给脚本的命令参数或选项输入,各种特殊变量存储传递的选项编号
指定的位置参数总数:$#
位置参数自身:$0、$1、..
所有位置参数:[email protected]、$*
例:编辑脚本,实现ping 命令,当未指定IP时,应有提示语
#!/bin/bash
while [ "$#" -eq "0" ]
do
echo "please give me an ip address!"
break
Done
##当位置参数总数=0时表示没有指定IP,则提示给IP
while [ "$#" -gt "0" ]
do
ping -c 1 $1 >/dev/null && echo "$! is up" || echo"$1 is down"
当可以ping通时则输出该IP is up ,若不能ping 通则输出该IP is down
break
done
七、test条件判断
1.test命令可用于评估bash脚本中的表达式。如果表达式返回值得为true,返回零退出状态;如果表达式为false,则返回值非零退出状态。
2.格式如下:
test 表达式
test [表达式]
3.字符串比较运算符:=、!=
数学比较运算: -eq ##等于
-ne ##不等于
-lt ##小于
-le ##小于等于
-gt ##大于
-ge ##大于等于
-n ##不为空时
-z ##为空时
如:["a" -eq "0" ] ##判断a是否等于0
[-z "a"] ##当a不为空时,则成立
4.文件状态运算符
test -e 文件 ##检测文件收否存在
-b 文件 ##文件类型是否时块类型
-c ##是否是字符类型
-d ##是否是目录
-f ##是否是普通文件
-S ##是否是套接字文件
-L ##是否是链接文件
例:编辑脚本,检测指定文件类型
例:编辑脚本,执行后可以自动建立/mnt/user中的用户
例:编辑脚本,输入delete时,删除指定文件中的用户名;输入create时,创建指定文件中的用户
八、自动应答问题软件expect
expect软件可以实现交互,但不是shell
其执行器/usr/bin/expect
执行脚本:文件名.exp
脚本内容格式:
#!/usr/bin/expect
spawn /mnt/ask.sh ##监视脚本/mnt/ask.sh,或者监控某命令
expect "who" ##遇到“who”字符
send "bai\r" ##则自动输入“bai”,且自动回车
...
expecteof ##自动退出
:wq
expect 文件名.exp ##执行脚本
interact ##执行完成后保持交互状态,即不立即退出,需手动退出
$argv 参数数组 ##expect脚本可以接受从bash传递过来的参数,可以使用[lindex $argv n ]获得,n从0开始,分别表示第一个,第二个..参数
例:自动远程登录指定IP 的主机
再次远程连接172.25.254.90主机,将不能完成自动登录,因为无“yes/no”环节
编写程序如下:
#!/usr/bin/expect
set ip [ lindex $argv 0]
spawn ssh [email protected]$ip
expect {
"yes/no" {send "yes\r";exp_continue} ##若有该问题则回答,若没有则跳过回答
"password:" {send "westos\r"}
}
interact
自动显示远程登录主机的主机名
八、环境变量
1.在shell中定义变量,只针对所打开的shell生效--环境级变量
2.在用户家目录中声明变量,只对当前用户生效--用户级
3.在/etc/profile中声明变量,对任何用户均可生效--系统级变量
声明变量格式:
export 变量名=值
刷新文件,使声明变量生效:source 文件名