bash-条件判断

摘要:
[0-9]+$]]; Thenecho“$INTisainteger.”exit0elseecho“$INTasainteger.“&˃/dev/nullexit1fi首先确定变量INT的字符串形式是否满足^-?“;fi4。ifi=1;[$i-lt10];theecho“$i”elseecho“End”fi这意味着,如果可以后跟任意数量的命令,那么将执行所有命令,但只有最后一个命令将被判断为真或假。即使之前的所有命令都失败,只有最后一个命令返回0,那么将执行then的部分,这可以理解为iffalse;真实;“嗨”;case结构格式模式中的case表达式)命令;;pattern)命令;;。。。esacexpression是一个表达式#!

bash-判断

文件判断

  • [ -a file ]:如果file存在,则为true
  • [ -b file ]:如果file存在并且是一个块设备文件,则为true
  • [ -c file ]:如果file存在并且是一个字符设备文件,则为true
  • [ -d file ]:如果file存在并且是一个目录,则为true
  • [ -e file ]:如果file存在,则为true
  • [ -f file ]:如果file存在并且是一个普通文件,则为true
  • [ -g file ]:如果file存在并且设置了组ID,则为true
  • [ -G file ]:如果file存在并且属于有效的组ID,则为true
  • [ -h file ]:如果file存在并且是符号链接,则为true
  • [ -k file ]:如果file存在并且设置了"stick bit",则为true
  • [ -L file ]:如果file存在并且是一个符号链接,则为true
  • [ -N file ]:如果file存在并且自上次读取后已被修改,则为true
  • [ -O file ]:如果file存在并且属于有效的用户ID,则为true
  • [ -p file ]:如果file存在并且是一个命名管道,则为true
  • [ -r file ]:如果file存在并且可读(当前用户有可读权限),则为true
  • [ -s file ]:如果file存在并且其长度大于零,则为true
  • [ -S file ]:如果file存在并且是一个网络socket,则为true
  • [ -t fd ]:如果fd是一个文件描述符,并且重定向到终端,则为true
  • [ -u file ]:如果file存在并且设置了setuid位,则为true
  • [ -w file ]:如果file存在并且可写(当前用户拥有可写权限),则为true
  • [ -x file ]:如果file存在并且可执行,则为true
  • [ file1 -nt file2 ]:如果file1比file2的更新时间最近,或者file1存在而file2不存在,则为true
  • [ file1 -ot file2 ]:如果file1比file2的更新时间更旧,或者file2存在而file1不存在,则为true
  • [ file1 -ef file2 ]:如果file1和file2引用相同的设备和iNode编号,则为true

字符串判断

  • [ string ]:如果string不为空(长度大于0),则为true
  • [ -n string ]:如果string长度大于0,则为true
  • [ -z string ]:如果string长度为0,则为true
  • [ string1 = string2 ]:如果string1和string2相同,则为true
  • [ string1 == string2 ]:???
  • [ string1 != string2 ]:如果string1和string2不相同,则为true
  • [ string1 '>' string2 ]:如果按照字典顺序string1排列在string2之后,则为true
  • [ string1 '<' string2 ]:如果按照字典顺序string1排列在string2之前,则为true

test和[]中>和<,必须用引号引起来或用反斜杠转义,否则会被shell解释为重定向操作符

整数判断

  • [ int1 -eq int2 ]:如果int1 == int2,则为true
  • [ int1 -ne int2 ]:如果int1 != int2,则为true
  • [ int1 -le int2 ]:如果int1 <= int2,则为true
  • [ int1 -lt int2 ]:如果int1 < int2,则为true
  • [ int1 -ge int2 ]:如果int1 >= int2,则为true
  • [ int1 -gt int2 ]:如果int1 > int2,则为true

数值判断不能用>,<,=等进行判断

正则判断

  1. [[ expression ]]支持正则表达式

    1. 格式:[[ string1 =~ regex ]]

      #!/bin/bash
      INT=-3
      if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
      	echo "$INT is an integer."
      	exit 0
      else
      	echo "$INT is not an integer." &>/dev/null
      	exit 1
      fi
      先判断变量INT的字符串形式,是否满足^-?[0-9]+$的正则模式,如果满足就表明它是一个整数
      

算数判断

  • ((1))表示判断成立为真,((0))表示判断不成立为假
  • ((3 > 2)) = ((3>2)) = (( 3 > 2 )) = (( 3 > 2))

注意点

  1. test expression = [ expression ] = [[ expression ]]
  2. test expression 和 [ expression ]不支持正则表达式,[[ expression ]]支持
  3. 在 test 和 []中的变量要放在双引号之中,可以防止$variable为空(例[ -e "$variable" ]),导致[ -e ]判断为值,而放在双引号当中,返回的就总是一个空字符串,[ -e "" ]会判断为假。 但是在[[ -e $variable ]]中可以不加双引号

逻辑运算

  • AND = && = -a
  • OR = || = -o
  • NOT = !
  1. 对判断进行逻辑运算

    1. [[ $INT -ge 1 && $INT -le 50 ]]

    2. [ !( $INT -ge 1 -a $INT -le 50 )]

      test命令内部使用的圆括号,必须使用引号或者转义,否则会被Bash解释

  2. 对普通命令进行逻辑运算

    1. command1 && command2,先执行command1,成功后才执行command2
    2. command1 || command2,先执行command1,失败后才执行command2

if结构

  1. 格式:

    if commands; then
    	commands
    	[elif commands; then
    		commands...]
    	[else
    		commands]
    fi
    
  2. commands可以是

    1.
    if test $USER == "root"; then
    	echo "Hi,root."
    else
    	echo "You are not root."
    fi
    2.
    if true
    then
    	echo "hi,true."
    fi
    3.
    if echo "hi"; then echo "Hi,man!";fi
    4.
    if i=1;[ $i -lt 10 ]; then
    	echo "$i"
    else
    	echo "End"
    fi
    这个表示if后面可以跟任意数量的命令,这时所有的命令都会执行,但是判断真伪只看最后一个命令,即使前面所有的命令都失败,只有最后一个命令返回0,就会执行then的部分,可以理解为 if false;true; then echo "Hi";fi
    

case结构

  1. 格式

    case expression in
    	pattern)
    		commands ;;
    	pattern)
    		commands ;;
    	...
    esac
    
  2. expression是一个表达式

    #!/bin/bash
    OS=$(uname -s)
    
    case "$OS" in
    	FreeBSD) echo "FreeBSD";;
    	Darwin) echo "Mac OSX";;
    	AIX) echo "AIX";;
    	Minix) echo "Minix";;
    	Linux) echo "Linux";;
    	*) echo "Failed to identify this OS";;
    esac
    
  3. pattern是表达式的值或一个模式(可以使用通配符),可以有多条,用来匹配多个值,每条以两个分号结尾

    #!/bin/bash
    
    echo -n "Enter a letter or number: "
    read character
    case $character in
    	[[:lower:]] | [[:upper:]])
    		echo "Entered letter $character";;
    	[0-9])
    		echo "Entered number $character";;
    	*)
    		echo "Input does not meet requirements."
    esac
    
  4. Bash4.0之前,case结果只能匹配一个条件,然后就会推出case结构;Bash4.0之后,允许匹配多个条件,这时可以用;;&终止每个条件块

    #!/bin/bash
    
    read -n 1 -p "Enter a character: "
    case $REPLY in
    	[[:upper:]]) echo "$REPLY is a capital letter." ;;&
    	[[:lower:]]) echo "$REPLY is a lowercase letter." ;;&
    	[[:alpha:]]) echo "$REPLY is a letter." ;;&
    	[[:digit:]]) echo "$REPLY is a digit." ;;&
    esac
    

免责声明:文章转载自《bash-条件判断》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Kmalloc可以申请的最大内存基于redis的点赞功能设计下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【编程基础】CppLint工具使用过程

前言 coding最好要形成一定的编程风格,一般常用的开源风格有google code style,可以使用cpplint工具检查是否符合该编程风格。 目录 1. linux系统使用过程; 2. windows系统使用过程; 注意,目前cpplint.py是基于python2的脚本,若要使用python3请按照python3改写cpplint.py。 操作...

zabbix 监控客户端数据库 zabbix客户端

[root@zabbix客户端 zabbix]# grep -v "^$" etc/zabbix_agentd.conf|grep -v "^#" LogFile=/tmp/zabbix_agentd.log Server=127.0.0.1,zabbix_server_ip ServerActive=zabbix_server_ip:10051#注...

cygwin putty安装配置及配置显示中文

准备:1.下安装cygwin2.注意选择sshd组件 2.安装putty   步骤:1. 修改环境变量    在path中添加putty所在目录的路径,让putty能在任何位置直接执行 2. 修改cygwin的启动批处理文件    cygwin.bat,如下:       @echo off      D:      chdir D:\cygwin...

telnet批量测试端口脚本

作者都已经备注的很详细了,不在赘述。 telnet.sh #!/bin/bash #功能,批量telnet端口,输入参数需要测试的IP:PORT列表文件:telnet_list.txt(文件名可以自定义,但是只能跟脚本放在同一目录) #使用方法: telnet.sh telnet_list.txt ;或者后台执行: sh telnet.sh telnet_...

shell高级-----创建函数

基本脚本函数 1、创建函数 有两种格式可以用来在bash shell脚本中创建函数。第一种采用关键字function。后跟分配给该代码的函数名。 function name { commands } name属性定义了赋予函数唯一的名称。脚本中定义的每个函数都必须有一个唯一的名称。commands是构成函数的一条或多条bash...

[shell]实现脚本执行结果匹配某个字符串

今天接到一个这个要求,就是脚本执行结果中包含某个字符串,要求查出来。 我给的思路是 按照脚本名和结果 以 追加 的方式写入文本,然后从这个文本中查找相应的内容。 对方给的思路是以执行结果来判断,就自己实现了这种方式 首先是按照目录写入脚本,这里是在脚本中写入了echo $i的内容。也就是脚本有执行结果。 #!/bin/bash SH_DIR=sh_dir...