shell基础语法
几种条件判断类型(判断语句基础)
两种判断格式:
- [root@localhost ~]# test -e /root/install.log
- [root@localhost ~]# [ -e /root/install.log ](推荐)
- 注意事项:中括号与表达式之间必须有空格,否则报错:[ 表达式 ]
1. 按照文件类型进行判断
测试选项 | 作 用 |
---|---|
-b 文件 | 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真) |
-c 文件 | 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) |
-d 文件 | 判断该文件是否存在,并且是否为目录文件(是目录为真) |
-e 文件 | 判断该文件是否存在(存在为真) |
-f 文件 | 判断该文件是否存在,并且是否为普通文件(是普通文件为真) |
-L 文件 | 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真) |
-p 文件 | 判断该文件是否存在,并且是否为管道文件(是管道文件为真) |
-s 文件 | 判断该文件是否存在,并且是否为非空(非空为真) |
-S 文件 | 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真) |
举例:
# 第一个判断命令如果正确执行,则打印“yes”,否则打印“no”
[ -d /root ] && echo "yes" || echo "no"
2. 按照文件权限进行判断
测试选项 | 作 用 |
---|---|
-r 文件 | 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真) |
-w 文件 | 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真) |
-x 文件 | 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真) |
-u 文件 | 判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真) |
-g 文件 | 判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真) |
-k 文件 | 判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真) |
举例:
# 判断文件是拥有写权限的
[ -w student.txt ] && echo "yes" || echo "no"
3. 两个文件之间进行比较
测试选项 | 作 用 |
---|---|
文件1 -nt 文件2 | 判断文件1的修改时间是否比文件2的新(如果新则为真 newer than) |
文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2的旧(如果旧则为真 older than) |
文件1 -ef 文件2 | 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法 |
举例:
# 创建个硬链接
ln /root/student.txt /tmp/stu.txt
# 用test测试下,果然很有用
[ /root/student.txt -ef /tmp/stu.txt ] && echo "yes" || echo "no"
yes
4.两个整数之间的比较
测试选项 | 作 用 |
---|---|
整数1 -eq 整数2 | 判断整数1是否和整数2相等(相等为真) |
整数1 -ne 整数2 | 判断整数1是否和整数2不相等(不相等位置) |
整数1 -gt 整数2 | 判断整数1是否大于整数2(大于为真) |
整数1 -lt 整数2 | 判断整数1是否小于整数2(小于位置) |
整数1 -ge 整数2 | 判断整数1是否大于等于整数2(大于等于为真) |
整数1 -le 整数2 | 判断整数1是否小于等于整数2(小于等于为真) |
举例:
[ 23 -ge 22 ] && echo "yes" || echo "no"
yes
#判断23是否大于等于22,当然是了
[ 23 -le 22 ] && echo "yes" || echo "no"
no
#判断23是否小于等于22,当然不是了
5. 两个字符串的判断
测试选项 | 作用 |
---|---|
-z 字符串 | 判断字符串是否为空(为空返回真 ) |
-n 字符串 | 判断字符串是否为非空(非空返回真 ) |
字串1 == 字串2 | 判断字符串1是否和字符串2相等(相等返回真) |
字串1 != 字串2 | 判断字符串1是否和字符串2不相等(不相等返回真) |
举例:
name=sc
#给name变量赋值
[ -z "$name" ] && echo "yes" || echo "no"
no
# 判断name变量是否为空,因为不为空,所以返回no
aa=11
bb=22
#给变量aa和变量bb赋值
[ "$aa" == "$bb" ] && echo "yes" || echo "no"
no
#判断两个变量的值是否相等,明显不相等,所以返回no
6. 多重条件判断(与或非)
测试选项 | 作用 |
---|---|
判断1 -a 判断2 | 逻辑与,判断1和判断2都成立,最终的结果才为真 |
判断1 -o 判断2 | 逻辑或,判断1和判断2有一个成立,最终的结果就为真 |
!判断 | 逻辑非,使原始的判断式取反 |
举例:
aa=11
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
no
#判断变量aa是否有值,同时判断变量aa的是否大于23
#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假
aa=24
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
yes
if语句
语法
单分支if语句方式一:
if [ 条件判断式 ];then
程序
fi
单分支if语句方式二(推荐):
if [ 条件判断式 ]
then
程序
fi
双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2 „省略更多条件…
else
当所有条件都不成立时,最后执行此程序
fi
范例
范例1:备份mysql数据库
#!/bin/bash
# 备份mysql数据库。
# Author: jerry
# 同步系统时间,联网有效
ntpdate asia.pool.ntp.org &>/dev/null
#把当前系统时间按照“年月日”格式赋予变量date
date=$(date +%y%m%d)
#统计mysql数据库的大小,并把大小赋予size变量
size=$(du -sh /var/lib/mysql)
if [ -d /tmp/dbbak ]
then
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
范例2:判断apache是否启动
#!/bin/bash
# Author: jerry
# 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print$2}')
if [ "$port" == "open" ]
then
echo “$(date) httpd is ok!” >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &>/dev/null
echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi
范例3:判断用户输入的是什么文件(文件/目录)
#!/bin/bash
# 判断用户输入的是什么文件
# Author: jerry
# 接收键盘的输入,并赋予变量file
read -p "Please input a filename: " file
if [ -z "$file" ] # 判断file变量是否为空
then
echo "Error,please input a filename"
exit 1
elif [ ! -e "$file" ] # 判断file的值是否存在
then
echo "Your input is not a file!"
exit 2
elif [ -f "$file" ] # 判断file的值是否为普通文件
then
echo "$file is a regulare file!"
elif [ -d "$file" ] # 判断file的值是否为目录文件
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi
case语句
语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
范例:判断用户输入
#!/bin/bash
#判断用户输入
# Author: jerry
read -p "Please choose yes/no: " -t 30 cho
case $cho in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is error!"
;;
esac
for循环
语法
语法一:不知道循环个数(in)
for 变量 in 值1 值2 值3
do
程序
done
语法二:知道循环个数
for ((初始值;循环控制调节;变量变化))
do
程序
done
范例
范例1:批量解压缩
#!/bin/bash
# Author:jerry
# 批量解压缩软件包
cd /lamp
ls *.tar.gz > ls.log #ls *.tar.gz 输出结果覆盖到ls.log文件
for i in $(cat ls.log)
do
tar -zxf $i $>/dev/null
done
rm -rf /lamp/ls.log
范例2: 批量创建用户
#!/bin/bash
# Author: jerry
# 批量添加新用户
# 输入用户名,等待时间30s
read -p "Please input user name: " -t 30 name
# 输入创建用户个数,等待时间30s
read -p "Please input the number of users: " -t 30 num
# 输入用户密码,等待时间30s
read -p "Please input the password of users: " -t 30 pass
#判断输入信息是否为空
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
# 通过sed命令把所有的数字替换为空
y=$(echo $num | sed s/'^[0-9]*$'//g)
if [ -z "$y" ] # 如果num为数字,y必为空
then
for ((i=1;i<=$num;i++)) #开始循环
do
# 建立用户
/usr/sbin/useradd "$name$i" &>/dev/null
# 设置用户密码,与用户名相同
echo $pass | /usr/bin/passwd --stdin "$name$i" &>/dev/null
done
echo "Build seccees!"
fi
fi
while循环与until循环
- while循环:只要条件成立,循环就会一直继续,条件不成立,循环停止。
- until循环:与while相反,只要条件不成立,循环一直继续,条件成立,循环结束。
语法
while循环语法
# 语法一
while [ 条件判断式 ]
do
程序
done
# 语法二
while:
do
if [ 条件判断式 ]
then
exit
done
until循环语法
until [ 条件判断式 ]
do
程序
done
范例
范例一:从1加到100(while)
#!/bin/bash
# 从1加到100
# Author: jerry
i=1
s=0
# 如果变量i的值小于等于100,则执行循环
while [ $i -le 100 ]
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s
范例二:从1加到100(until)
#!/bin/bash
# 从1加到100
# Author: jerry
i=1
s=0
# 如果变量i的值小于等于100,则执行循环
until [ $i -gt 100 ]
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s