1、算数运算符

在 shell 中,bash 不支持原生的数学运算,需要利用第三方工具来如 letexpr 等来实现
image.png

1、let

let 运算后需要将其赋值给一个变量。

  1. zhangl@zhangl-PC:~/code/shell$ A=1
  2. zhangl@zhangl-PC:~/code/shell$ B=2
  3. zhangl@zhangl-PC:~/code/shell$ let C=${A}+${B} # 运算符前后不能有空格
  4. zhangl@zhangl-PC:~/code/shell$ echo ${C}
  5. 3

2、expr

可以利用 expr 对数组进行运算,C=$(expr $A+$B)
+ 号两边需要有空格,不然会将其当作字符串连接

  1. zhangl@zhangl-PC:~/code/shell$ C=`expr ${A} + ${B}`
  2. zhangl@zhangl-PC:~/code/shell$ echo ${C}
  3. 3

3、[]

  1. zhangl@zhangl-PC:~/code/shell$ D=$[${A}+${B}]
  2. zhangl@zhangl-PC:~/code/shell$ echo ${D}
  3. 3

4、(())

  1. zhangl@zhangl-PC:~/code/shell$ E=$((${A}+${B}))
  2. zhangl@zhangl-PC:~/code/shell$ echo ${E}
  3. 3


2、关系运算符

关系运算符只能比较数字,不能用其来比较字符串
image.png

  1. num1=1
  2. num2=2
  3. if [ ${num1} -eq ${num2} ]
  4. then
  5. echo "${num1} -eq ${num2} : num1 等于 num2"
  6. else
  7. echo "${num1} -eq ${num2} : num1 不等于 num2"
  8. fi
  9. if [ $num1 -ne $num2 ]
  10. then
  11. echo "$num1 -ne $num2: num1 不等于 num2"
  12. else
  13. echo "$num1 -ne $num2 : num1 等于 num2"
  14. fi
  15. if [ $num1 -gt $num2 ]
  16. then
  17. echo "$num1 -gt $num2: num1 大于 num2"
  18. else
  19. echo "$num1 -gt $num2: num1 不大于 num2"
  20. fi
  21. if [ $num1 -lt $num2 ]
  22. then
  23. echo "$num1 -lt $num2: num1 小于 num2"
  24. else
  25. echo "$num1 -lt $num2: num1 不小于 num2"
  26. fi
  27. if [ $num1 -ge $num2 ]
  28. then
  29. echo "$num1 -ge $num2: num1 大于或等于 num2"
  30. else
  31. echo "$num1 -ge $num2: num1 小于 num2"
  32. fi
  33. if [ $num1 -le $num2 ]
  34. then
  35. echo "$num1 -le $num2: num1 小于或等于 num2"
  36. else
  37. echo "$num1 -le $num2: num1 大于 num2"
  38. fi

3、布尔运算符

与或非
image.png

  1. #!/bin/bash
  2. num1=10
  3. num2=20
  4. if [ $num1 -lt 40 -a $num2 -gt 15 ];then
  5. echo "$num1 小于 40 且 $num2 大于 15 : 返回 true"
  6. else
  7. echo "$num1 小于 40 且 $num2 大于 15 : 返回 fnum1lse"
  8. fi
  9. echo "或运算"
  10. if [ $num1 -lt 40 -o $num2 -gt 40 ];then
  11. echo "$num1 小于 40 或 $num2 大于 40 : 返回 true"
  12. else
  13. echo "$num1 小于 40 或 $num2 大于 40 : 返回 fnum1lse"
  14. fi
  15. echo "非运算"
  16. if [ $num1 != $num2 ];then
  17. echo "$num1 != $num2 : num1 不等于 num2"
  18. else
  19. echo "$num1 != $num2: num1 等于 num2"
  20. fi

4、逻辑运算符

image.png

  1. #!/bin/bash
  2. num1=1
  3. num2=2
  4. if [[ $num1 -lt 5 && $num2 -gt 5 ]];then
  5. echo "返回 true"
  6. else
  7. echo "返回 false"
  8. fi
  9. if [[ $num1 -lt 5 || $num2 -gt 5 ]];then
  10. echo "返回 true"
  11. else
  12. echo "返回 false"
  13. fi

5、字符串运算符

= 和 == 相同 都是判断是否相等
image.png

  1. #!/bin/bash
  2. str1="linux"
  3. str2="shell"
  4. if [ $str1 = $str2 ];then
  5. echo "$str1 = $str2 : str1 等于 str2"
  6. else
  7. echo "$str1 = $str2: str1 不等于 str2"
  8. fi
  9. if [ $str1 != $str2 ];then
  10. echo "$str1 != $str2 : str1 不等于 str2"
  11. else
  12. echo "$str1 != $str2: str1 等于 str2"
  13. fi
  14. if [ -z $str1 ];then
  15. echo "-z $str1 : 字符串长度为 0"
  16. else
  17. echo "-z $str1 : 字符串长度不为 0"
  18. fi
  19. if [ -n "$str1" ];then
  20. echo "-n $str1 : 字符串长度不为 0"
  21. else
  22. echo "-n $str1 : 字符串长度为 0"
  23. fi
  24. if [ ${str1} ];then
  25. echo "str1 : 字符串不为空"
  26. else
  27. echo "str1 : 字符串为空"
  28. fi

6、文件测试运算符

image.png

  1. #!/bin/bash
  2. # 遍历给定目录,统计目录下的file、dir数量
  3. # 判断输入参数:如果参数个数不是1个,提示错误
  4. [ $# -ne 1 ] && echo "输入参数错误, ${0} check_dir" && exit 1
  5. # 扫描路径为第一个参数
  6. PATH=$1
  7. # 如果路径不存在,输出错误提示
  8. [ ! -d ${PATH} ] && echo "目录${PATH}不存在" && exit 1
  9. # 定义数组,存储
  10. DIRS=()
  11. FILES=()
  12. OTHERS=()
  13. DIR_NO=0
  14. FILE_NO=0
  15. OTHER_NO=0
  16. for item in ${PATH}/*
  17. do
  18. if [ -d ${item} ];then
  19. DIRS[${#DIRS[*]}]="${item}"
  20. DIR_NO=$[${DIR_NO}+1]
  21. elif [ -f ${item} ];then
  22. FILES[${#FILES[*]}]="${item}"
  23. FILE_NO=$((${FILE_NO}+1))
  24. else
  25. OTHERS[${#OTHERS[*]}]="${item}"
  26. OTHER_NO=`expr ${OTHER_NO}+1`
  27. fi
  28. done
  29. echo "目录的数量是: ${#DIRS[*]}"
  30. echo "文件的数量是: ${#FILES[*]}"
  31. echo "其他的数量是: ${#OTHERS[*]}"
  32. echo "-------------------------------------"
  33. echo "DIR数量是: ${DIR_NO}"
  34. echo "FILE数量是: ${FILE_NO}"
  35. echo "OTHER数量是: ${OTHER_NO}"
  36. echo "------------------------------------"
  37. echo "DIR列表: ${DIRS[*]}"
  38. echo "FILE列表: ${FILES[@]}"
  39. echo "OTHER列表: ${OTHERS[*]}"