2018-4-18 17周1次课 shell逻辑判断、文件目录属性判断、if、case

20.5 shell脚本中的逻辑判断



·格式1:if 条件; then 语句; fi

例:a=5

if [ $a -gt 3 ]; then echo ok; fi

[[email protected] shell]# sh if1.sh
ok

·格式2:if 条件; then 语句; else 语句; fi

例:a=5

if [ $a -gt 3 ]; then echo ok; else echo nook; fi

[[email protected] shell]# sh if1.sh
ok

[[email protected] shell]# sh if1.sh
not ok
[[email protected] shell]# sh -x if1.sh
+ a=2
+ '[' 2 -gt 3 ']'
+ echo not ok
not ok

·格式3:if …; then … ;elif …; then …; else …; fi

第一个条件,怎样;第二个条件,怎样;。。。否则,其他条件

[[email protected] shell]# sh -x if1.sh
+ a=3
+ '[' 3 -gt 4 ']'
+ '[' 3 -lt 6 ']'
+ echo '<6 && >1'
<6 && >1

[[email protected] shell]# sh -x if1.sh
+ a=5
+ '[' 5 -lt 4 ']'
+ '[' 5 -gt 6 ']'
+ echo not ok
not ok

·逻辑判断表达式:

if [ $a -gt $b ]; -gt (>); 大于

if [ $a -lt 5 ]; -lt(<); 小于

if [ $b -eq 10 ]等   -eq(==); 等于

-le(<=);-ge(>=); -ne(!=) 注意到处都是空格

·如果非要用 > < ,可以用(( ))

[[email protected] shell]# if (($a>1));then echo ok;fi

ok

·可以使用 && || 结合多个条件

·if [ $a -gt 5 ] && [ $a -lt 10 ]; then 并且

·if [ $b -gt 5 ] || [ $b -lt 3 ]; then 或者






20.6 文件目录属性判断


·[ -f file ] 判断是否是普通文件,且存在

·[ -d file ] 判断是否是目录,且存在

·[ -e file ] 判断文件或目录是否存在

·[ -r file ] 判断文件是否可读

·[ -w file ] 判断文件是否可写

·[ -x file ] 判断文件是否可执行

·[ -f file ] 判断是否是普通文件,且存在

[[email protected] ~]# sh -x file1.sh
+ f=/tmp/alex
+ '[' -f /tmp/alex ']'                ##是否存在且是文件
+ touch /tmp/alex##不存在则创建
[[email protected] ~]# sh -x file1.sh
+ f=/tmp/alex
+ '[’ -f /tmp/alex ']'                ##是否存在且是文件
+ echo /tmp/alex exist                ##显示存在
/tmp/alex exist

·[ -d file ]判断是否是目录,且存在

[[email protected] ~]# sh -x file2.sh
+ f=/tmp/alex
+ '[' -d /tmp/alex ']'
+ touch /tmp/alex
[[email protected] ~]# sh -x file2.sh
+ f=/tmp/alex
+ '[' -d /tmp/alex ']'
+ touch /tmp/alex

·[ -e file ]判断文件或目录是否存在

[[email protected] ~]# sh -x file2.sh
+ f=/tmp/alex
+ '[' -e /tmp/alex ']'
+ echo /tmp/alex exist
/tmp/alex exist

·[ -r file ]判断文件是否可读

[[email protected] shell]# sh file2.sh
/tmp/alex readable

·[ -w file ]判断文件是否可写

[[email protected] shell]# sh file2.sh
/tmp/alex writeable

·[ -x file ]判断文件是否可执行

[[email protected] ~]# sh file2.sh
[[email protected] ~]# ll /tmp/alex
-rw-r--r-- 1 root root 0 4月  18 21:21 /tmp/alex
#!/bin/bash
f="/tmp/alex"
if [ -f $f ]
then
rm -f $f
fi

可以不用if判断,写成

#!/bin/bash
f="/tmp/alex"
[ -f $f ] && rm -f $f
#!/bin/bash
f="/tmp/alex"
if [ -f $f ]
then
rm -f $f
else
touch $f
fi

原脚本可取反写为

#!/bin/bash
f="/tmp/alex"
if [ ! -f $f ]
then
touch $f
fi

可以不用if判断,写成

#!/bin/bash
f="/tmp/alex"
[ -f $f ] || touch $f




20.7 if特殊用法


·if [ -z "$a" ]  这个表示当变量a的值为空时会怎么样(变量要加引号,文件不用引号)

可优化为

[[email protected] shell]# sh -x file3.sh
++ wc -l /tmp/jojo
wc: /tmp/jojo: 没有那个文件或目录
+ n=
+ '[' -z '' ']'
+ echo not exist
not exist

可以再优化为

[[email protected] shell]# sh -x file3.sh
++ wc -l /tmp/jojo
wc: /tmp/jojo: 没有那个文件或目录
+ n=
+ '[' -f ']'
+ echo ' not exist.'
not exist.
+ exit

·if [ -n "$a" ] 表示当变量a的值不为空

[[email protected] shell]# echo $b
[[email protected] shell]# if [  -n 01.sh ];then echo ok;fi
ok
[[email protected] shell]# if [  -n "$b" ];then echo "$b";else echo "b is null";fi
b is null

·if grep -q '123' 1.txt; then  表示如果1.txt中含有'123'的行时会怎么样

[[email protected] shell]# if grep -w "user1" /etc/passwd;then echo "user1 exist";fi
user1:x:1011:1011::/home/user1:/bin/bash
user1 exist
[[email protected] shell]# if grep -wq "user1" /etc/passwd;then echo "user1 exist";fi
user1 exist                ##grep -q 静默输出
[[email protected] shell]# if ! grep -wq "user2" /etc/passwd;then useradd user2;fi

·if [ ! -e file ]; then 表示文件不存在时会怎么样

·if (($a<1)); then …等同于 if [ $a -lt 1 ]; then…

·[ ] 中不能使用<,>,==,!=,>=,<=这样的符号





20.8/20.9 case判断


·格式: case  变量名 in

value1)

command

;;

value2)

command

;;

*)

commond

;;

esac

::表示一个判断结束,进入下一个判断

·在case程序中,可以在条件中使用|,表示或的意思, 比如

2|3)

command

;;

· *)除以上所有之外的

·shell脚本案例

#!/bin/bash
read -p "Please input a number: " n        ##从标准输入读取输入并赋值给变量 n
if [ -z "$n" ]
then
echo "Please input a number."
exit 1##1是退出时的提示符
fi

n1=`echo $n|sed 's/[0-9]//g'`        ##从变量n中将数字替换为空,如果n1不为空,则不是纯数字,那么现实输入一个数字并退出
if [ -n "$n1" ]
then
echo "Please input a number."
exit 1
fi

if [ $n -lt 60 ] && [ $n -ge 0 ]            ##纯数字往下接着判断
then
tag=1                                        ##标记tag
elif [ $n -ge 60 ] && [ $n -lt 80 ]
then
tag=2
elif [ $n -ge 80 ]  && [ $n -lt 90 ]
then
tag=3
elif [ $n -ge 90 ] && [ $n -le 100 ]
then
tag=4
else
tag=0
fi
case $tag in
1)
echo "不及格"
;;
2)
echo "及格"
;;
3|4)
echo "优秀"
;;
*)
echo "The number range is 0-100."
;;
esac

·执行查看结果:

[[email protected] shell]# sh -x case.sh
+ read -p 'Please input a number: ' n
Please input a number: 77
+ '[' -z 77 ']'
++ echo 77
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ '[' 77 -lt 60 ']'
+ '[' 77 -ge 60 ']'
+ '[' 77 -lt 80 ']'
+ tag=2
+ case $tag in
+ echo $'\345\217\212\346\240\274'
及格
[[email protected] shell]# sh -x case.sh
+ read -p 'Please input a number: ' n
Please input a number: 8sdafasdf                ##输入一个非纯数字
+ '[' -z 8sdafasdf ']'
++ echo 8sdafasdf
++ sed 's/[0-9]//g'
+ n1=sdafasdf
+ '[' -n sdafasdf ']'
+ echo 'Please input a number.'
Please input a number.
+ exit 1
[[email protected] shell]# sh -x case.sh
+ read -p 'Please input a number: ' n
Please input a number: 123                    ##输入一个大于100的数字
+ '[' -z 123 ']'
++ echo 123
++ sed 's/[0-9]//g'
+ n1=
+ '[' -n '' ']'
+ '[' 123 -lt 60 ']'
+ '[' 123 -ge 60 ']'
+ '[' 123 -lt 80 ']'
+ '[' 123 -ge 80 ']'
+ '[' 123 -lt 90 ']'
+ '[' 123 -ge 90 ']'
+ '[' 123 -le 100 ']'
+ tag=0
+ case $tag in
+ echo 'The number range is 0-100.'
The number range is 0-100.

原文地址:http://blog.51cto.com/11530642/2105142

时间: 2024-07-31 01:33:52

2018-4-18 17周1次课 shell逻辑判断、文件目录属性判断、if、case的相关文章

2018.4.18 17周1次课

十七周一次课(4月18日) 20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断 20.5 shell脚本中的逻辑判断 格式1不带else:if 条件 ; then 语句; fi 编辑if1.sh文件:vi if1.sh #!/bin/bash/ a=5 if [ $a -gt 3 ] then echo ok fi 格式2带有else:if 条件; then 语句; else 语句; fi #!/bin/bash/ a=1

2018.4.23 17周4次课

十七周4次课(4月23日) 20.20 告警系统主脚本 20.21 告警系统配置文件 20.22 告警系统监控项目 20.20 告警系统主脚本 创建告警系统的目录: [[email protected] /usr/local/sbin]# mkdir mon [[email protected] /usr/local/sbin]# ls mon  nginx_log_rotate.sh [[email protected] /usr/local/sbin]# cd mon [[email pro

2018.4.19 17周2次课

十七周二次课(4月19日) 20.10 for循环 20.11/20.12 while循环 20.13 break跳出循环 20.14 continue结束本次循环 20.15 exit退出整个脚本 20.10 for循环 for循环结构是在日常运维工作中使用最频繁的循环结构. 语法:for 变量名 in 条件; do -; done 数字循环:vi for1.sh #!/bin/bash sum=0 for i in `seq 1 3` #循环的条件还可以引用系统命令的执行结果(如seq 1

2018-4-20 17周3次课 shell函数、数组、告警需求分析

20.16/20.17 shell中的函数 ·函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function f_name() { command } 函数必须要放在最前面 ·示例1 #!/bin/bash input() {                        ##定义f_name最好不要和shell里面的关键词冲突     echo $1 $2 $# $0 } input 1 a b $1 $2 第一个,第

2018-4-22 17周4次课 shell告警系统脚本配置

20.20 告警系统主脚本 把shell脚本放在 /usr/local/sbin 目录下,方便查找 [[email protected] ~]# cd /usr/local/sbin/ [[email protected] sbin]# mkdir mon/ [[email protected] sbin]# cd mon/ [[email protected] mon]# mkdir bin conf shares mail log [[email protected] mon]# ls bi

2017.12.18 2周1次课

2017.12.18 二周第一次课 2.6 相对和绝对路径 什么是一个文件的路径呢 简单地说,就是这个文件存放的地方.只要你告诉系统某个文件的路径,系统就可以找到这个文件 Linux中,存在着绝对路径和相对路径. 绝对路径:路径一定是由根目录"/"开头的,不管在哪个目录下,都能通过绝对路径找到这个文件. 相对路径 :是你所在位置的路径,以当前目录开头的. 查看当前目录的路径,使用命令[pwd] ".ssh/authorized_keys"就是相对路径,相对"

2018.3.1 10周2次课

十周第二次课(3月1日) 11.14/11.15 Apache和PHP结合 11.16/11.17 Apache默认虚拟主机 11.14/11.15 Apache和PHP结合 配置httpd支持php httpd主配置文件/usr/local/apache2.4/conf/httpd.conf vim /usr/local/apache2.4/conf/httpd.conf   //修改以下4个地方 ServerName 搜索ServerName,把#ServerName www.example

2018.1.9 5周2次课

五周第二次课(1月9日) 7.6 yum更换国内源 7.7 yum下载rpm包 7.8/7.9 源码包安装 7.6 yum更换国内源 1.恢复之前备份的文件 2. 进入"/etc/yum.repos.d"目录 3.删除"CentOS-Base.repo"文件 4.下载"163.repo"文件 wget http://mirrors.163.com/.help/CentOS7-Base-163.repo curl -O http://mirrors

2018.1.16 6周2次课

六周第二次课(1月16日) 9.4/9.5 sed 9.4/9.5 sed 其实grep工具的功能还不够强大,它实现的只是查找功能,而不能把查找的内容替换.以前用vim操作文档的时候,可以查找也可以替换, 但只限于在文本内部操作,而不能输出到屏幕上.sed工具以及后面要介绍的awk工具就能把替换的文本输出到屏幕上,而且还有其他更丰富的功能.sed和awk都是流式编辑器,是针对文档的行来操作的. sed  '/x/'p filename:匹配x字符 sed  -n  '/x/'p  filenam