rhce第二天笔记
bash编程
条件测试操作
test命令
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test 条件表达式 [ 条件表达式 ] test相当于后边的方括号即方括号与test功能是相同的
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值
格式:test 条件表达式 [ 条件表达式 ] test相当于后边的方括号即方括号与test功能是相同的
测试文件状态
格式:[ 操作符 文件或目录 ]
常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否可执行(Excute)该文件
-L:测试是否为符号连接(Link)文件
格式:[ 操作符 文件或目录 ]
常用的测试操作符
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否可执行(Excute)该文件
-L:测试是否为符号连接(Link)文件
返回值为0时表示上一步测试的条件成立
整数值比较
格式:[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
格式:[ 整数1 操作符 整数2 ]
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
字符串比较
格式:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
格式:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
[ -z 字符串 ]
常用的测试操作符
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
逻辑测试
格式:[ 表达式1 ] 操作符 [ 表达式2 ] ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
前后两个表达式都成立时整个测试结果才为真,否则为假
-o或||:逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
!:逻辑否
当指定的条件不成立时,返回结果为真
格式:[ 表达式1 ] 操作符 [ 表达式2 ] ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
前后两个表达式都成立时整个测试结果才为真,否则为假
-o或||:逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
!:逻辑否
当指定的条件不成立时,返回结果为真
常见的测试类型
测试文件状态
字符串比较
整数值比较
逻辑测试
条件语句
if条件语句
单分支
if 命令
then 如果符合则
fi 结束
应用示例:
如果/boot分区的空间使用超过80%,输出报警信息
如果/boot分区的空间使用超过80%,输出报警信息
#!/bin/bash
RATE=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1 `
if [ $RATE -gt 80 ]
then
echo "Warning,DISK is full!"
fi
RATE=`df -hT | grep "/boot" | awk '{print $6}' | cut -d "%" -f1 `
if [ $RATE -gt 80 ]
then
echo "Warning,DISK is full!"
fi
多分支
if 命令
then 如果符合则......
else 不付合则......
fi 结束
应用示例:
判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务
判断mysqld是否在运行,若已运行则输出提示信息,否则重新启动mysqld服务
#!/bin/bash
service mysqld status &> /dev/null
if [ $? -eq 0 ]
then
echo "mysqld service is running."
else
/etc/init.d/mysqld restart
fi
service mysqld status &> /dev/null
if [ $? -eq 0 ]
then
echo "mysqld service is running."
else
/etc/init.d/mysqld restart
fi
case 多重分支语句
循环语句
for 循环语句
格式
for 变量 i 定义变量内容
do
done结束
应用示例1:
依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串
依次输出3条文字信息,包括一天中的“Morning”、“Noon”、“Evening”字串
[root@localhost ~]# vi showday.sh
#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
echo "The $TM of the day."
done
#!/bin/bash
for TM in "Morning" "Noon" "Evening"
do
echo "The $TM of the day."
done
验证脚本执行结果:
[root@localhost ~]# sh showday.sh
The Morning of the day.
The Noon of the day.
The Evening of the day
应用示例2:
The Morning of the day.
The Noon of the day.
The Evening of the day
对于使用“/bin/bash”作为登录Shell的系统用户,检查他们在“/opt”目录中拥有的子目录或文件数量,如果超过100个,则列出具体个数及对应的用户帐号
#!/bin/bash
DIR="/opt"
LMT=100
ValidUsers=`grep "/bin/bash" /etc/passwd | cut -d ":" -f 1`
for UserName in $ValidUsers
do
Num=`find $DIR -user $UserName | wc -l`
if [ $Num -gt $LMT ] ; then
echo "$UserName have $Num files."
fi
done
while循环
格式:
while 命令或表达式
do
命令列表
done 结束
应用示例1:
批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
这些用户的初始密码均设置为“123456”
批量添加20个系统用户帐号, 用户名依次为“stu1”、“stu2”、……、“stu20”
这些用户的初始密码均设置为“123456”
#!/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
i=`expr $i + 1`
done
i=1
while [ $i -le 20 ]
do
useradd stu$i
echo "123456" | passwd --stdin stu$i &> /dev/null
i=`expr $i + 1`
done
应用示例2:
批量删除上例中添加的20个系统用户帐
批量删除上例中添加的20个系统用户帐
#!/bin/bash
i=1
while [ $i -le 20 ]
do
userdel -r stu$i
i=`expr $i + 1`
done
i=1
while [ $i -le 20 ]
do
userdel -r stu$i
i=`expr $i + 1`
done
case 多重分支语句
格式:
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
* )
默认执行的命令序列
esac
模式1)
命令序列1
;;
模式2)
命令序列2
;;
……
* )
默认执行的命令序列
esac
应用示例1:
编写脚本文件 mydb.sh,用于控制系统服务mysqld
当执行 ./mydb.sh start 时,启动mysqld服务
当执行 ./mydb.sh stop 时,关闭mysqld服务
如果输入其他脚本参数,则显示帮助信息
当执行 ./mydb.sh start 时,启动mysqld服务
当执行 ./mydb.sh stop 时,关闭mysqld服务
如果输入其他脚本参数,则显示帮助信息
#!/bin/bash
case $1 in
start)
echo "Start MySQL service."
;;
stop)
echo "Stop MySQL service."
;;
*)
echo "Usage:$0 start|stop"
;;
esac
case $1 in
start)
echo "Start MySQL service."
;;
stop)
echo "Stop MySQL service."
;;
*)
echo "Usage:$0 start|stop"
;;
esac
应用示例2:
提示用户从键盘输入一个字符,判断该字符是否为字母、数字或者其它字符,并输出相应的提示信息
提示用户从键盘输入一个字符,判断该字符是否为字母、数字或者其它字符,并输出相应的提示信息
#!/bin/bash
read -p "Press some key, then press Return:“ KEY
case "$KEY“ in
[a-z]|[A-Z])
echo "It's a letter."
;;
[0-9])
echo "It's a digit."
;;
*)
echo "It's function keys、Spacebar or other keys. "
esac
read -p "Press some key, then press Return:“ KEY
case "$KEY“ in
[a-z]|[A-Z])
echo "It's a letter."
;;
[0-9])
echo "It's a digit."
;;
*)
echo "It's function keys、Spacebar or other keys. "
esac
until 循环语句
格式:
until 条件测试命令
do
命令序列
done
do
命令序列
done
**break语句
在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体后的语句
continue语句
在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环**
shell函数
Shell函数概述
在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数
合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率
在编写Shell脚本程序时,将一些需要重复使用的命令操作,定义为公共使用的语句块,即可称为函数
合理使用Shell函数,可以使脚本内容更加简洁,增强程序的易读性,提高执行效率
定义函数:
function 函数名{命令序列}
或者
函数名(){命令序列}
调用已定义函数:
函数名
调用函数直接输入函数名
???向函数内传递参数:
应用示例:
在脚本中定义一个加法函数,用于计算2个整数的和
调用该函数计算(12+34)、(56+789)的和
在脚本中定义一个加法函数,用于计算2个整数的和
调用该函数计算(12+34)、(56+789)的和
#!/bin/bash
adder() {
echo `expr $1 + $2`
}
adder 12 34
adder 56 789
adder() {
echo `expr $1 + $2`
}
adder 12 34
adder 56 789
验证脚本执行结果:
[root@localhost ~]# sh adderfun.sh
46
845
46
845
$1 表示取运行脚本所输入的第一个字符串如./bash.sh aa 那么$1就取aa的值**$2$3与之相同???
转载于:https://blog.51cto.com/dongluji/1352182