常用字符串测试操作符


-n  字符串     若字符串的长度不为0,则为真

-z  字符串      若字符串的长度为0,则为真

串1 = 串2      若字符串1等于字符串2,则为真

串1 != 串2   若字符串1不等于字符串2,则为真


需要注意的是:

对于字符串的测试,一定要给变量字符串加双引号在进行比较。

比较符合(例如 = 和 !=)的两端一定要要有空格

!= 和 =可用于比较两个字符串是否相同

例如:

root@ubuntu:~/xpf# [ -n "abc" ] && echo 1 || echo 0
1
root@ubuntu:~/xpf# test -n "abc" && echo 1 || echo 0
1
root@ubuntu:~/xpf# xx=xpg
root@ubuntu:~/xpf# [ -n "$xx" ] && echo 1 || echo 0
1
root@ubuntu:~/xpf# var=
root@ubuntu:~/xpf# [ -z "$var" ] && echo 1 || echo 0
1
root@ubuntu:~/xpf# var=rr
root@ubuntu:~/xpf# [ -z "$var" ] && echo 1 || echo 0
0
root@ubuntu:~/xpf# [ "abc" = "abc" ] && echo 1 || echo 0
1
root@ubuntu:~/xpf# [ "abc" != "abc" ] && echo 1 || echo 0 
0
root@ubuntu:~/xpf#

如果字符串比较时若等号两端没有空格,则会导致判断出现逻辑判断,即使语法正确,但是结果有问题。



切记:对于字符串的验证,一定要使用双引号。


整数二元比较操作

在[ ]里面是哟个的操作符    在[[ ]]或者(( )) 使用的操作符

-eq                                           ==或=                 想等

-ne                                          !=                       不等

-gt                                           >                          大于

-ge                                           >=                      大于等于

-lt                                            <                        小于

-le                                          <=                     小于等于



需要注意的是在 [ ] 里面也可以使用 > ,<   但是要使用反斜线转义,个人感觉还不如使用  -eq 之类进行数字比较

root@ubuntu:~/xpf# [ 2 < 1 ] && echo 1 || echo 0 
1
root@ubuntu:~/xpf# [ 2 \< 1 ] && echo 1 || echo 0
0
root@ubuntu:~/xpf# [ 2 == 1 ] && echo 1 || echo 0  
0
root@ubuntu:~/xpf# [ 2 = 1 ] && echo 1 || echo 0 
0
root@ubuntu:~/xpf# [ 2 != 1 ] && echo 1 || echo 0
1
root@ubuntu:~/xpf# [ 2 -gt 1 ] && echo 1 || echo 0  
1

为了避免错误,还是使用数据比较符进行比较

root@ubuntu:~/xpf# [ 2 -ge 2 ] && echo 1 || echo 0
1
root@ubuntu:~/xpf# [ 2 -gt 1 ] && echo 1 || echo 0  
1
root@ubuntu:~/xpf# [ 2 -lt 1 ] && echo 1 || echo 0 
0
root@ubuntu:~/xpf# [ 2 -le 1 ] && echo 1 || echo 0 
0
root@ubuntu:~/xpf# [ 2 -le 3 ] && echo 1 || echo 0 
1
[ ]和[[ ]]
root@ubuntu:~/xpf# [[ 5 > 3 ]] && echo 1 || echo 0  
1
root@ubuntu:~/xpf# [[ 5 = 3 ]] && echo 1 || echo 0 
0
root@ubuntu:~/xpf# [[ 5 < 3 ]] && echo 1 || echo 0 
0
root@ubuntu:~/xpf# [[ 5 != 3 ]] && echo 1 || echo 0 
1

个人感觉使用[ ]比较好用,有特殊的正则表达式在用。


整数表示测试:

root@ubuntu:~/xpf# [ $xx -gt $cc ] && echo 1 || echo 0    
0
root@ubuntu:~/xpf# [ $xx -lt $cc ] && echo 1 || echo 0  
1
root@ubuntu:~/xpf# [ $xx -eq $cc ] && echo 1 || echo 0  
0
root@ubuntu:~/xpf# [ $xx -ne $cc ] && echo 1 || echo 0  
1

利用[[ ]]和(( ))实现整数条件测试

root@ubuntu:~/xpf# [[ $xx < $cc ]] && echo 1 || echo 0 
1
root@ubuntu:~/xpf# [[ $xx > $cc ]] && echo 1 || echo 0
0
root@ubuntu:~/xpf# (( $xx < $cc )) && echo 1 || echo 0 
1
root@ubuntu:~/xpf# (( $xx > $cc )) && echo 1 || echo 0    
0

关于整数的比较。(( ))语法要优先[[ ]],,但是还是首先推荐使用(),然后就是(( )),最后使用[[ ]].



逻辑判断符:

在[ ]里面是哟个的操作符    在[[ ]]或者(( )) 使用的操作符

              -a                                        &&                                      与

              -o                                         ||                                         或

              !                                        !                                         非


逻辑操作符的实践事例

root@ubuntu:~/xpf# [ -f "$ff" -a -f "$ccc" ] && echo 1 || echo 0
0
root@ubuntu:~/xpf# [ -f "$ff" -a -f "$xx" ] && echo 1 || echo 0   
1
root@ubuntu:~/xpf# [ -f "$ff" -o -f "$xxx" ] && echo 1 || echo 0 
1
root@ubuntu:~/xpf# [ -! "$ff" ] && echo 1 || echo 0              
bash: [: -!: unary operator expected
0
root@ubuntu:~/xpf# [ ! "$ff" ] && echo 1 || echo 0  
0

需要注意的是:

“-a”和“-o”逻辑操作符符号需要用于[ ]中

  && 和 || 逻辑操作符可用于[[]]和(( ))中,y饿可以外部连接多个[ ]

  注意:在[ ]和[[ ]]的两端及比较符号的两端。必须要有空格


逻辑操作符企业案例

#!/bin/bash

read -p "input a num:" num     #注意这里的空格以及:符号

if [ "$num" -eq 1 -o "$num" -eq 2 ]
  then
    echo $num
    exit 5
else
  echo "this is bad"
fi

使用脚本传参或者read读入的方法

没有使用if的情况下,判断两个大小,将大的数字输出。

错误的把<0的数排除
#!/bin/bash

read -p "input a num:" num
read -p "ubput other num:" num1


[ "$num" -gt 0 -a "$num" -gt 0 ] || exit 5
[ `expr $num + $num1` ] || exit 4
[ $num -ge $num1 ] && echo "$num" || echo "$num1"



第二种:  传参判断
#!/bin/bash
a=$1
b=$2

[ $# -ne 2 ] && {
  echo "pleases two usage;"
  exit 1
}

expr $a + 10 > /dev/null
aa=$?
expr $b + 10 > /dev/null
bb=$?

[ $aa -eq 0 -a $bb -eq 0 ] || {
  echo "this is a bad num"
  exit
}
[ $a -gt $b ] && echo ""$a" > "$b"" || echo ""$a" < "$b""

写一个脚本,自动安装lamp或者lnmp。

要求:

当用户输入1时,输出“start install lamp”,提示执行/service/scripts/lamp.sh输出“lamp is installed” 并退出脚本

当用户输入2时,输出“start install lnmp”,提示执行/service/scripts/lamp.sh输出“lnmp is installed” 并退出脚本

当用户输入3时,退出

当用户输入其他时,报错退出

#!/bin/bash
[ -d "/service/scripts" ] || mkdir -p /service/scripts


echo "pleaes your choice."
cat <<END
  1.install lamp
  2.install lnmp
  3.exit
END

read -p "plz your choice: " num

[ "$num" -ne 1 -a  "$num" -ne 2 -a "$num" -ne 3 ] && {
  echo "input error"
  exit 2
}
if [ $num -eq 1 ]; then
  echo "start install lamp"     
  if [ -x /server/scripts/lamp.sh ]; then
          source /service/scripts/lamp.sh > /dev/null
          exit $?
  else
      echo "bad"
      exit 4
  fi
fi

[ $num -eq 3 ] && echo exit 3