首页 > 系统相关 >shell编程 判断结构语句(if、case)

shell编程 判断结构语句(if、case)

时间:2022-11-08 11:15:29浏览次数:40  
标签:case shell exists expression 编程 echo file fi true

一、if 语句 if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。 Shell 有三种 if ... else 语句: if ... fi 语句; if ... else ... fi 语句; if ... elif ... else ... fi 语句。   语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi   ## 注意, expression 和方括号([ ])之间必须有空格,否则会有语法错误。   if [ expression ] then Statement(s) to be executed if expression is true else Statement(s) to be executed if expression is not true fi   ## 如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。 ## 如果 then 和 if [ expression ]同一行,则[ expression ]和then之间必须有 ;   if [ expression 1 ] then Statement(s) to be executed if expression 1 is true elif [ expression 2 ] then Statement(s) to be executed if expression 2 is true elif [ expression 3 ] then Statement(s) to be executed if expression 3 is true else Statement(s) to be executed if no expression is true fi     二、if语句的运算符 必须记得:运算符和表达式之间必须有空格,例如2+2是不正确的,它应该写成2 + 2。   1、关系运算符 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 数字比较 -eq 等于,如:if [ "\$a" -eq "\$b" ] -ne 不等于,如:if [ "\$a" -ne "\$b" ] -gt 大于,如:if [ "\$a" -gt "\$b" ] -ge 大于等于,如:if [ "\$a" -ge "\$b" ] -lt 小于,如:if [ "\$a" -lt "\$b" ] -le 小于等于,如:if [ "\$a" -le "\$b" ]   字符串比较 = 等于,如:if [ "\$a" = "\$b" ] == 等于,如:if [ "\$a" == "\$b" ],与=等价 != 不等于,如:if [ "\$a" != "\$b" ]   注意: [[]]和[]中的行为在某些情况下是不同的:   [[ \$a == z* ]] # 如果\$a 以"z"开头(模式匹配)那么将为true [[ \$a == "z*" ]] # 如果\$a 等于z* (字符匹配),那么结果为true   [ \$a == z* ] # File globbing 和word splitting 将会发生 [ "\$a" == "z*" ] # 如果\$a 等于z* (字符匹配),那么结果为true   != 不等于,如:if [ "\$a" != "\$b" ] 注意:!= 在[[]]结构中使用模式匹配.   < 小于,在ASCII 字母顺序下.如: if [[ "\$a" < "\$b" ]] if [ "\$a" \< "\$b" ] 注意:在[]结构中"<"需要被转义.   > 大于,在ASCII 字母顺序下.如: if [[ "\$a" > "\$b" ]] if [ "\$a" \> "\$b" ] 注意:在[]结构中">"需要被转义.     注意:在[] 表达式中,常见的>,<需要加转义字符,表示字符串大小比较,以acill码 位置作为比较。 不直接支持<>运算符,还有逻辑运算符|| && 它需要用-a[and] –o[or]表示 注意:[[]] 运算符只是[]运算符的扩充。能够支持<,>符号运算不需要转义符,它还是以字符串比较大小。里面支持逻辑运算符:|| &&   2、逻辑运算符(布尔运算符) ! 非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。 -a 逻辑与 exp1 -a exp2 如果exp1 和exp2 都为true 的话,这个表达式将返回true -o 逻辑或 exp1 -o exp2 如果exp1 和exp2 中有一个为true 的话,那么这个表达式就返回true   注意,-a 和 -o 放在[] 内部。   但在[[]]使用 &&和| | 代替-a 和-o, -o 和-a 一般都是搭配test 命令或者[] 语法格式: if [ 条件判断一 ] && (||) [ 条件判断二 ]; then elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then else 执行第三段內容程式 fi   if [ ! "\$repo" ] || [ ! "\$distro" ]; then ......... fi   -O file exists and is owned by the user ID of this process. [[ \$a == "z*" ]] # 如果\$a 等于z* (字符匹配),那么结果为true     3、判断上一个语句是否执行成功 shell中使用符号 “\$?” 来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败。 结合if-else语句实现判断上一个命令是否执行成功。 示例: ls ./ if [ \$? -eq 0 ]; then     echo "succeed" else     echo "failed" fi # 上述 if 语句可以写为一行,例如: if [ \$? -eq 0 ]; then echo "succeed"; else echo "failed"; fi     三、Linux shell中文件测试运算符 文件测试运算符用于检测 Unix 文件的各种属性。   -a file exists. -b file exists and is a block special file. 文件是个块设备(软盘,cdrom 等等) -c file exists and is a character special file. 文件是个字符设备(键盘,modem,声卡等等) -d file exists and is a directory. 检测文件是否是目录,如果是,则返回 true。 -e file exists (just the same as -a). 文件存在 -f file exists and is a regular file. 一般文件是否存在。 -g file exists and has its setgid(2) bit set. 检测文件是否设置了 SGID 位,如果是,则返回 true。 -G file exists and has the same group ID as this process. -k file exists and has its sticky bit set. 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 -L file exists and is a symbolic link. 检测文件是否是symbolic link文件 -n string length is not zero. -o Named option is set on. -O file exists and is owned by the user ID of this process. -p file exists and is a first in, first out (FIFO) special file or named pipe. -r file exists and is readable by the current process. -s file exists and has a size greater than zero. 文件是否存在并且是否为非空,不为空返回 true。 -S file exists and is a socket. -t file descriptor number fildes is open and associated with a terminal device. -u file exists and has its setuid(2) bit set. 检测文件是否设置了 SUID 位,如果是,则返回 true。 -w file exists and is writable by the current process. -x file exists and is executable by the current process. -z string length is zero.   -z 检测字符串长度是否为0,为0返回 true。 -n 检测字符串长度是否不为0,不为0返回 true。注意,使用-n在[]结构中测试必须要用""把变量引起来. str 检测字符串是否为空,不为空返回 true。如 [ \$a ] 返回 true。 注意: 对于字符串或数字的比较, 加上双引号("")是没有坏处的, 而且能避免一些不必要的麻烦(但模式和正则表达式不能加双引号. )     # 判断一个文件是否存在且是否为空: if [ -e \$result -a ! -s \$result ];then echo "empty" fi   # shell判断文件、目录是否存在或者具有权限 例如: #!/bin/sh mypath="/var/log/httpd/" myFile="/var /log/httpd/access.log" # 这里的-x 参数判断\$myPath是否存在并且是否具有可执行权限 if [ ! -x "\$myPath" ]; then mkdir "\$myPath" fi   # 这里的-d 参数判断\$myPath是否为目录 if [ ! -d "\$myPath" ]; then mkdir "\$myPath" fi   # 这里的-f参数判断\$myFile是否存在 if [ ! -f "\$myFile" ]; then touch "\$myFile" fi   # 其他参数还有-n,-n是判断一个变量是否是否有值 if [ ! -n "\$myVar" ]; then echo "\$myVar is empty" exit 0 fi   # 两个变量判断是否相等 if [ "\$var1" = "\$var2" ]; then echo '\$var1 eq \$var2' else echo '\$var1 not eq \$var2' fi   四、变量判断的一些说明 shell的几个小要点: 1、定义变量时,变量名前不用加 \$.如: declare -A array ## 定义一个关联数组array 但是引用变量的值时,需要在变量名前添加 \$. 如: echo -e \${array[0]}   2、变量赋值时,= 两边不能有空格,否则内核会视为其他操作。   3、将shell变量等于命令的结果 方法一: 使用符号 `` a=`date` 方法二: a=\$(date) 例如: file=\$(readlink -f \$1)   先写一些基本语法: 1、字符串判断 = 等于,如:if [ "\$a" = "\$b" ] == 等于,如:if [ "\$a" == "\$b" ],与=等价 str1 = str2       当两个串有相同内容、长度时为真 str1 != str2      当串str1和str2不等时为真 -n str1        当串的长度大于0时为真(串非空) -z str1        当串的长度为0时为真(空串) str1         当串str1为非空时为真   2、数字的判断 int1 -eq int2    两数相等为真 int1 -ne int2    两数不等为真 int1 -gt int2    int1大于int2为真 int1 -ge int2    int1大于等于int2为真 int1 -lt int2    int1小于int2为真 int1 -le int2    int1小于等于int2为真   3 文件的判断 -r file     用户可读为真 -w file     用户可写为真 -x file     用户可执行为真 -a file file是否exists -e file (just the same as -a). 文件是否存在 -f file     文件为正规文件为真 -d file     文件为目录为真 -c file     文件为字符特殊文件为真 -b file     文件为块特殊文件为真 -s file     文件存在且文件大小非0时为真 -t file     当文件描述符(默认为1)指定的设备为终端时为真   3、复杂逻辑判断 -a         与 -o        或 !        非     五、判断一个变量是否为空 可以通过如下方式判断一个shell变量是否为空: 1. 变量通过" "引号引起来 如下所示:,可以得到结果为 IS NULL. #!/bin/sh para1= if [ ! -n "\$para1" ]; then echo "IS NULL" else echo "NOT NULL" fi   2. 直接通过变量判断 如下所示:得到的结果为: IS NULL #!/bin/sh para1= if [ ! \$para1 ]; then echo "IS NULL" else echo "NOT NULL" fi   3. 使用test判断 得到的结果就是: dmin is not set! #!/bin/sh dmin= if test -z "\$dmin" then echo "dmin is not set!" else echo "dmin is set !" fi   4. 使用""判断 #!/bin/sh dmin= if [ "\$dmin" = "" ] then echo "dmin is not set!" else echo "dmin is set !" fi     六、case语句 case ... esac 是一种多分枝选择结构。 case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:   case 值 in 模式1) command1 command2 ;; 模式2) command1 command2 ;; *) command1 command2 ;; esac   case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。   取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 匹配模式中可使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。[]是专门针对单字符的值,如果用[no],就是n和o之一。   if, case,匹配字符串最常见,但如何匹配一段很长的输出,一堆文字?最好方法,用“*”,如:*"command not found"*   例子: #!/bin/bash case \$1 in dog) echo cat ;; cat) echo dog ;; *) echo "/root/script.sh cat|dog" ;; esac     #!/bin/bash getyn() { # 构建getyn函数 while echo "enter y/n :" do read yn case \$yn in [yY]) return 0 ;; [nN]) return 1 ;; * ) echo "only accept Y,y,N,n" ;; esac done }   if getyn # 调用函数。以函数作为if条件,必须用if command 法,不能有[] then echo "your answer is yes" else echo "your anser is no" fi    

标签:case,shell,exists,expression,编程,echo,file,fi,true
From: https://www.cnblogs.com/xiezh/p/16868991.html

相关文章

  • VC++_读取SHELL命令结果
    voidCFfmpeg_divide_videoDlg::OnButtonBeginDivide(){SECURITY_ATTRIBUTESsa;HANDLEhRead,hWrite;sa.nLength=sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDe......
  • linux服务器上使用find查杀webshell木马方法
    linux服务器上使用find查杀webshell木马方法本文转自:http://ju.outofmemory.cn/entry/256317只要从事互联网web开发的,都会碰上web站点被入侵的情况。这里我把查杀的一......
  • 1.0 新建VSTO项目 并使用Excel880VSTO框架改善编程体验
    小目标:VSTO新建Excel插件项目,并使用VSTO880框架改善编码体验如何创建全新的VSTO插件项目注意项目目录尽量保持和我的教程目录一致设置在D:\VSTO880\Project注意框架版......
  • VBA代码助手功能概览,可以瞬间10倍提升VBA编程速度
    VBA代码助手下载地址主要功能:VBA代码库管理视频演示内置VBA常用代码库,自定义代码库收藏管理,代码库导入导出神键手输入提示视频演示VBA代码关键字自动补全,中文......
  • Window编程模型
    Windows程序采用如下图所示的事件驱动编程模型,应用程序通过处理操作系统发送来的消息来响应事件。事件可能是一次击键、鼠标单击或是要求窗口更新的命令以及其他事情。Wind......
  • delphi D11编程语言手册 学习笔记
    ●P30:在声明一个函数或者过程时,在其上方用///或者{!  插入注释,在其它地方使用时,把鼠标悬停在这个函数或者过程上面,会显示出这些注释Delphi新注释更多请查......
  • Java网络编程
    软件结构C/S结构:即Client/Server结构,指客户端和服务器结构。常见的有QQ、迅雷等。B/S结构:即Browser/Server结构,指浏览端和服务器结构。常见的有谷歌浏览器、火狐浏览器等......
  • Different lower_case_table_names settings for server (‘1‘) and data dictionary
    ubuntu18.04mysql8.0 ubuntu18.04下/etc/mysql/ mysql.cnf 里面加上了这么一段:[mysqld]lower_case_table_names=1#protocol=tcp为的是解决大小写敏感的问题,可是重启m......
  • 并发编程 - Atomic & Unsafe
    1.全面地走一遍Atomic包下面的原子类;2.CAS->原子比较与交换算法的bug-ABA问题;3.魔法类-Unsafe,ini->堆外内存Atomic1.atomic底层实现是基于无锁算法-cas;......
  • 编程语言分类
    编程语言分类及区别一、按历代分类编程语言分为三大类:机器语言、汇编语言、高级语言第一代语言(1GL):机器语言特征:面向机器的指令,机器可以直接执行。第二代语言(2GL):汇编......