Shell条件表达式
条件表达式介绍
条件表达式,我们非常的常用,可以说,任何编程语言,都离不开条件表达式,但是每种变成语言的写法都不太一样,在shell中,有一种独特的写法。
条件测试语句
条件测试语句,我们又叫做test语句。
test: 条件测试
[]: 条件测试(语法:中括号两边一定要有空格)例:[ -f /etc/passwd ] 错误写法: [-f /etc/passwd]
[[]]: 支持正则(语法:中括号两边一定要有空格)
文件判断
-f: file 判断普通文件是否存在,如果存在则为真,如果不存在则为假
-d: directroy 判断目录是否存在,如果存在则为真,如果不存在则为假
-e: exists 判断是否存在,如果存在则为真,如果不存在则为假(不分文件还是目录)
-r: read 先判断文件是否存在,如果存在再判断是否有读权限,如果存在并且有读取权限则为真,否则为假(root用户永远有读取权限)
-w: write 先判断文件是否存在,如果存在再判断是否有写权限,如果存在并且有写权限则为真,否则为假(root用户永远有写权限)
-x: exec 先判断文件是否存在,如果存在再判断是否有执行权限,如果存在并且有执行权限则为真,否则为假
-s: size 先判断文件是否存在,如果存在再判断文件大小是否为0,如果是0则为假,如果大于0则为真(空文件为假,非空文件为真)
-L: link 先判断文件是否存在,如果存在再判断文件是否为软连接文件,如果是则为真,否则为假
-nt: newer than 判断文件是否较新,如果是则为真,否则为假
-ot: older than 判断文件是否较旧,如果是则为真,否则为假
[ -f /etc/zls.txt ] && echo '文件已存在' || echo '文件不存在'
[ -f /etc/passwd ] && {
echo '文件已存在'
} || {
echo '文件不存在'
touch /etc/zls.txt
}
优化计算器
#!/bin/bash
num1=$1
num2=$2
[ $# -ne 2 ] && {
echo '传递两个参数'
exit 1
}
expr $num1 + $num2 &>/dev/null
[ $? -ne 0 ] && {
echo '传递两个数字'
exit 2
}
awk "BEGIN{print $num1+$num2}"
awk "BEGIN{print $num1-$num2}"
awk "BEGIN{print $num1*$num2}"
awk "BEGIN{print $num1/$num2}"
字符串表达式
注意:大写的注意,在shell脚本中所有变量的调用,请一定加上双引号,尤其是和字符串相关的,千言万语汇成一 句话"加双引号"如果让我看见你不加,那么你帽子颜色和加双引号一个颜色。
-n: not null 非空则成立
-z: null 空则成立
"str1" = "str2"
"str1" != "str2"
整数表达式
-eq:equal 等于 =
-ne:not equal 不等于 !=
-gt:greater than 大于 >
-ge:greater than or equal 大于等于 >=
-lt:less than 小于 <
-le:less than or equal 小于等于 <=
两个中括号的成员运算(正则表达式)
#!/bin/bash
[ 1 = 1 ] && echo ok || echo not ok
[ 1 -eq 1 ] && echo ok || echo not ok
[ 1 -ge 1 ] && echo ok || echo not ok
[ 2 > 1 ] && echo ok || echo not ok
name=zls996
[[ "$name" =~ 'z' ]] && echo '在' || echo '不在'
[[ "$name" =~ [0-9] ]] && echo '有' || echo '没有'
cat 14_cal.sh
num1=$1
num2=$2
[ $# -ne 2 ] && {
echo '传递两个参数'
exit 1
}
expr $num1 + $num2 &>/dev/null
[ $? -ne 0 ] && {
echo '传递两个数字'
exit 2
}
float_int="^[-0-9]+$|^[-0-9]+\.[0-9]+$"
if [[ $num1 =~ $float_int && $num2 =~ $float_int ]];then
awk "BEGIN{print $num1+$num2}"
awk "BEGIN{print $num1-$num2}"
awk "BEGIN{print $num1*$num2}"
awk "BEGIN{print $num1/$num2}"
else
echo '传递两个整数或者浮点数'
fi
float="^[-0-9]+\.[0-9]+$"
int="^[-0-9]+$"
if [[ $num1 =~ $float || $num1 =~ $int && $num2 =~ $float || $num2 =~ $int ]];then
awk "BEGIN{print $num1+$num2}"
awk "BEGIN{print $num1-$num2}"
awk "BEGIN{print $num1*$num2}"
awk "BEGIN{print $num1/$num2}"
else
echo '传递两个整数或者浮点数'
fi
[ 条件1 -a 条件2 ] 两个条件都满足
[[ 条件1 && 条件2 ]] 两个条件都满足
[ 条件1 -o 条件2 ] 两个条件满足一个即可
[[ 条件1 || 条件2 ]] 两个条件满足一个即可
企业面试题
面试题1
命令行中输入一个数字,如果数字是1,则输出1,如果是2则输出2,既不是1也不是2则显示脚本使用方法,并退出 程序
[ $# -eq 1 ] || {
echo "Usage: $0 {1|2}"
exit 1
}
[ $1 -eq 1 -o $1 -eq 2 ] && echo "$1" || echo "Usage: $0 {1|2}"
[ $1 -ne 1 -a $1 -ne 2 ] && echo "Usage: $0 {1|2}" || echo "$1"
面试题2
使用read进行传参,实现两个整数比较大小,并将大的数字打印到屏幕上。
#!/bin/bash
read -p 'Pls Input Two Numbers: ' num1 num2
[ $num1 -gt $num2 ] && echo $num1 || echo $num2
read -p 'Pls Input Two Numbers: ' num1 num2
[[ $num1>$num2 ]] && echo $num1 || echo $num2
作业
1.写一个登录框(必做)
用户名:
密码:
判断:
1)用户是否存在
2)如果存在,密码是否正确
3)如果存在并且密码正确,登录成功
4)如果用户不存在,进入注册界面
5)注册界面:
注册名:
注册密码:
确认密码:
6)注册完成后再返回登录页面
#!/bin/bash
. /etc/init.d/functions
read -p '请输入登录用户: ' x
grep -w "$x" ./backup.txt >/dev/null
if [ $? -eq 0 ]; then
read -p '请输入登录密码: ' y
grep -w "$y" ./backup.txt >/dev/null
if [ $? -eq 0 ]; then
action "$x登录成功" /bin/true
exit 156
else
action "用户密码错误" /bin/false
fi
else
read -p '没有这个用户,是否创建用户yes或no: ' create_user
fi
if [ $create_user = yes ]; then
read -p '请注册用户名: ' user1
read -p '请输入注册的密码: ' passwd1
read -p '再次确认密码: ' passwd2
if [ $passwd1 = $passwd2 ];then
grep -w "$user1" ./backup.txt >/dev/null
if [ $? -eq 0 ];then
echo "已有$user1用户"
else
echo "$user1 $passwd1" >> ./backup.txt
fi
else
echo '密码错误'
exit 125
fi
else
echo '告辞'
fi
2.多选题(选做)
请选择你心仪对象的条件:
A: 女 B:身材好 C:有钱 D:脸蛋好
请输入对象条件:A
你选择的对象条件是 : 脸蛋好 身材好
|