shell脚本编程在linux系统管理拥有着极为强大的能力,可以说,当前的工作已经日益偏向自动化了。如果我们极不愿意去学习这方面的知识,可能在未来的工作中颇有不便。尽管我本人的编程能力较差,但是对于自动化的监控和警报,或者自动化的让系统自己处理一些小问题这类事情,我还是比较感兴趣的。一来不用自己天天盯着服务器,省出自己的时间去学习或做一些别的工作,无疑是更有意义的;其次呢,也是对于我的短板的补足,编程本身还是很有趣的,如果能够驾驭好这个工具,那可能真的可以创造出一个属于自己的世界。
一、脚本规则
1、文件名
通常,脚本文件由.sh结尾,便于标识和分辨脚本文件,linux系统中拥有大量的脚本文件,包括命令的执行也无法脱离脚本文件的存在。
2、内容声明
通常,脚本文件以#!/bin/bash为第一行,声明文件为bash脚本文件。
3、变量$符
变量是编程中最重要的元素之一,倘若一个程序均用常量编写,那么在参数改变或版本更迭中将遇到极大的麻烦。通常,引用变量的内容在变量名前增加一个$符即可。
4、引号
引号分为单引号和双引号,使用单引号时,引号中的内容将直接被引用,不考虑特殊字符的影响。而使用双引号时,特殊符号可能拥有特殊的含义,如需输出符号本身,则需要通过转义达到效果。
二、for循环
语法:
for 变量 in 循环次数(变量值)
do(循环体的开始)
循环体内容
done(循环体的结束)
for语句:
for num in $(seq 1 10)
for file in *.txt
例子1:
#!/bin/bash
for NAME in li zhang wang
#for语法 NAME变量 in 语法 变量的值(循环3次)
do
#开始循环
ADDRESS=$NAME@asfor.cn
#定义一个ADDRESS变量 引用NAME变量
MESSAGE=’Hello,ASFOR.CN!’
#单引号遇到特殊字符均不转义 定义一个MESSAGE变量
echo $MESSAGE | mail -s Reminder $ADDRESS
#发信语法:mail -s (subject) “主题” 用户 回车后写内容 以.点结束
#此处将 $MESSAGE 输出作为内容发送给 ADDRESS
done
#结束语法
例子2:
#!/bin/bash
#脚本声明
for num in $(seq 1 1000)
do
touch /tmp/file.$num && echo “/tmp/file.$num create successful”
done
三、if语句
if语法:
#!/bin/bash
DIR=”/tmp/redhat/data”
if [ -f “$DIR” ]; then
mv $DIR $DIR_bak
mkdir $DIR
elif [ -d “$DIR” ]; then
for FILES in $(find /etc/ -name "*.txt")
do
cp -r $FILES $DIR && echo "$FILES copy successful"
done
else
mkdir -p $DIR
fi
四、退出状态
1、$?判断上一次命令执行结果是否为真
0为真,即运行成功
1-255为假,即运行失败
一般运用 echo $? 将上一个命令执行结果状态打印至屏幕
2、COMMAND1 && COMMAND2 当命令1执行成功时则执行命令2
COMMAND1 || COMMAND2 当命令1执行失败时则执行命令2
3、人工赋值:将命令执行结果和exit返回值结果用{}括起来
五、TEST语句
使用中括号[]作为test命令作用于检查文件类型和比较值时,[ ]左右均需要添加空格,=左右也需要空格 ,否则将会视为赋值处理
1、表达式判断
(表达式) 判断表达式是否为真
!() 判断表达式是否不为真
表达式1 -a 表达式2 判断两个表达式是否都为真
表达式1 -o 表达式2 判断两个表达式是否有一个为真
-n STRING 判断字符串长度是否为非0
-z STRING 判断字符串长度是否为0
STRING1 = STRING2 两字符串是否相等
STRING1 != STRING2 两字符串是否不相等
2、INT判断
INT1 -eq INT2 判断两整型是否相等
INT1 -ge INT2 判断INT1是否大于或等于INT2
INT1 -gt INT2 判断INT1是否大于INT2
INT1 -le INT2 判断INT1是否小于或等于INT2
INT1 -lt INT2 判断INT1是否小于INT2
INT1 -ne INT2 判断两整型是否不相等
3、文件判断
FILE1 -ef FILE2 判断两文件是否有相同的设备号
FILE1 -nt FILE2 判断文件1是否比文件2新
FILE1 -ot FILE2 判断文件1是否比文件2旧
4、其他判断
-f 判断文件是否存在
-d判断文件夹是否存在
-x判断文件是否存在且是否可操作
-r判 断文件是否存在且是否可读取
-w判断文件是否存在且是否可写入
六、其他内容
1、passwd - -stdin(利用标准输入设置密码)
echo $USERS | passwd - -stdin $USERS
2、openssl rand -base64 6(密码长度)
随机生成6位数密码
3、语法:TEST=$(命令)
意义:将命令执行的结果作为值传递给变量
4、ping检测语句
ping -c1 172.25.254.1-10
5、pidof SERVERNAME
查看服务的进程ID