###shell脚本编写###
bash是GUN组织开发和推广的一个项目,bash脚本类似批处理,简单来说就是把许多指令集合在一起,并提供循环,条件,判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操
作,并可以完成图形工具所无法实现的功能。
一.创建新shell脚本的操作
1. 创建包含bash命令的文本文件。文件的第一行应为:
#!/bin/bash
2.使文件可执行
(1)可以vim xxx.sh然后使用 sh+xxx.sh 可以执行脚本
(2)chmod+x 脚本 输入绝对路径可以执行脚本
3.将文件放置在用户的$PATH的目录中
~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发、系统上的其他人使用的脚本
/usr/local/sbin - 本地开发、由root使用的脚本
直接运行脚本和使用source命令运行脚本是不同的!
4.引用和转义
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。
引用有三种类型:
(1)弱引用
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。
(2)强引用
将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:
例如:echo ‘$a‘
$a
(3)转义
非引用的\是转义字符。它保留了下一个字符的文字值。
例如:echo \#comment #
#comment
echo \#comment \#
#comment #
二.Shell变量
shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变
量的脚本。
例如:a=2
echo "$a"
2
三.算术运算符
<VARIABLE>++ ##增量后
<VARIABLE>-- ##减量后
- ##减法
+ ##加法
** ##幂运算
* ##乘法
/ ##除法
% ##余数
+= ##加等
-= ##减等
四.Shell计算命令
(1)用$[]表示数学运算
例:a=2
b=3
echo $[a+b]
5
(2)用expr表示数学运算
例:echo `expr 2 + 3`
5
(3)用let指示数学运算
例:let c=2+3
echo $c
5
(4)用(())表示数学运算
#!/bin/bash
for ((i=1;i<10;i++))
do
((j+=i))
done
echo $j
1.循环
例:for i in $(seq 2 2 4);do echo $i;done
2
4
2.循环与计算结合
#!/bin/bash
for ((i=1;i<=10;i++))
do
((j+=i))
#j=`expr $j + $i`
#let j+=i
#j=$[j+=i]
done
echo $j
五.bash位置参数
(1)使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量:
交互式输入
#read -p "please input your name: " un
(2)使用位置参数来读取传递给脚本的命令行参数或选项输入
Bash解析的个别参数或整个原始命令行。
指定的位置参数总数:$#
位置参数自身:$0、$1、$2、$3....
所有位置参数: $@、$*
六.退出状态
Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态
推出状态的值被存储在"?"中,可以使用以下命令查看:
# echo $?
七.test条件判断
test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式
为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语
法,使用方括号"[]"将表达式括起来,这样更易于阅读
(1)字符串比较运算符:=、!=
例:[ abc = abc ]; echo $?
0
(2)数字比较运算符:-eq、-ne、-lt、-le、-gt、-ge
例: [ 1 -ne 1 ]; echo $?
1
(3)文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} file/directory
例:[ -d /etc/passwd ]; echo $?
1
(4)二进制文件运算符:-ef、-nt、-ot
(5)逻辑运算符:-o、-a、!、&&、||
八 if语句
语法:if command; then command; command2; else command3; fi
九. case语句
case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪
部分代码。
十.expect语句
在shell中利用expect实现自动应答脚本。
例:[root@maillinux mnt]# vim ssh.exp
#!/usr/bin/expect
set IP [lindex $argv 0]
set PASS [lindex $argv 1]
spawn ssh root@$IP
expect {
"yes/no"
{send "yse\r";exp_continue}
"password:"
{send "$PASS\r"}
}
interact
[root@maillinux mnt]# chmod +x ssh.exp
[root@maillinux mnt]# /mnt/ssh.exp 172.25.254.121 redhat
[root@maillinux mnt]# /mnt/ssh.exp 172.25.254.121 redhat
spawn ssh root@172.25.254.121
root@172.25.254.121‘s password:
Last login: Sun Dec 11 03:57:15 2016 from 172.25.254.209
实验脚本编写
(1)十秒倒计时
vim shimiao.sh
#!/bin/bash
for ((SEC=10;SEC>0;SEC--)) ##
do
echo -ne "After ${SEC}s is end"
echo -ne "\r \r"
sleep 1
done
(2)一分十秒倒计时脚本
#!/bin/bash
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
echo -ne"After ${MIN}:${SEC}s is end "
sleep 1
echo -ne "\x \x"
while ["$SEC" -1e "0" -a "$MIN" -gt "0"]
do
echo -ne "After ${MIN}: ${SEC}s is end "
echo -ne "\x \x"
((MIN--))
SEC=10
done
done
(3)创建用户脚本
vim create_user.sh
#!/bin/bash
read -p "please create user:" user
useradd $user &> /dev/null
read -p "please set password:" ps
password $ps &> /dev/null
echo "set password sucessful !"
(4)输入0-10内数字比较大小
#!/bin/bash
read -p "please input a number: " num
[ $num -ge "0" -a $num -le "10" ] && echo yes || echo no
(5)ping教室的机子ip能ping通的显示up不能的显示down
#!/bin/bash
for NUM in{1..10}
do
ping -c1 -w1 172.25.254.$NUM &>/dev/null
while
["$?" -eq "0" ]
do
echo 172.25.254.$NUM is up
break
done
while
{"$?" -ne "0" }
do
echo 172.25.254.$NUM is done
done
done
(6)ping教室的机子ip能ping通的显示up不能的显示down
#!/bin/bash
for NUM in{1..10}
do
ping -c1 -w1 172.25.254.$NUM &/dev/null && echo 172.25.254.$NUM is up||echo 172.25.254.$NUM is done
done
(7)数据库数据备份脚本
#!/bin/bash
for x in $(mysq1 -uroot -phx1 -e "show databases;" -NE | grep -E "^\*|schema$".-v)
do
mysq1dump -uroot -phx1 $x >/mnt/$x-‘date‘ .dump
done
(8)查询文件类型
#!/bin/bash
if
[ -e "$1" ]
then
[ -f "$1" -a ! -L "$1" ] && echo $1 is a file
[ -b "$1" ] && echo $1 is a block
[ -c "$1" ] && echo is a block
else
[ -n "$1" ] && echo is not exist || echo "please input give me a file"
fi
(9)利用passwdfile和userfile来创建用户
可能出现的情况有:
1.passfile与userfile行数不同
2.passfile行数大于userfile
3.passfile行数小于userfile
4.没有输入passfile和userfile
if
[ -n "$1" -a -n "$2"]
then
if
[ -e "$1" -a -n "$2" ]
then
MAXUSER=`we -1 $1 | cut -d " " -f 1`
MAXPASS=`we -1 $2 | cut -d " " -f 1`
[ "$MAXUSER" -eq "$MAXPASS"]
for NUM in $( seq 1 $MAXPASS )
do
USERNAME=`sed -n ${NUM}p $1`
PASSWORD=`sed -n ${NUM}p $2`
CKUSER=`getend passwd $USERNAME`
[ -z "$CKUSER" ]
useradd $USERNAME
echo $PASSWORD |passwd --stdin $USERNAME
)||echo "$USERNAME exit !!"
done
||(
echo $1 and $2 have different lines
)
USERNAME=`sed -n ${NUM}p $1`
PASSWORD=`sed -n ${NUM}p $2`
CKUSER=`getend passwd $USERNAME`
[ -z "$CKUSER"]±
useradd $USERNAME
echo $PASSWORD |passwd--stdin $USERNAME
}||echo "$USERNAME exist !!"
done
}||(
echo $1 and $2 have different lines
)
elif
[ ‘ -e "$1" ]
then
echo "ERROR:$1 is not exit"
else
echo "ERROR:$2 is not exit"
fi
ERROR. Please input userfile and password file after command !!
原文地址:http://12183531.blog.51cto.com/12173531/1882872