bash中的算術運算及條件測試


bash的算術運算

+, -, *, /, %取模(取余), **(乘方)

實現算術運算:

  • (1) let var=算術表達式
  • (2) var=$[算術表達式]
  • (3) var=$((算術表達式))  //推薦使用這種類C風格
  • (4) var=$(expr arg1 arg2 arg3 ...)
  • (5) declare –i var = 數值
  • (6) echo ‘算術表達式’ | bc

注意:乘法符號有些場景中需要轉義,如*

bash有內建的隨機數生成器:$RANDOM(0-32767)

echo $[$RANDOM%50] :0-49之間隨機數

[989][root@centos6: /root]# num1=10 [990][root@centos6: /root]# num2=20 [993][root@centos6: /root]# let sum=${num1}+${num2} [993][root@centos6: /root]# echo ${sum} 30 [994][root@centos6: /root]# echo $[${num1}+${num2}] 30 [995][root@centos6: /root]# echo $((${num1}+${num2})) 30 [996][root@centos6: /root]# nu12=$(expr ${num1} \* ${num2}) [998][root@centos6: /root]# echo ${nu12} 200

增強型賦值:

+=, -=, *=, /=, %=

let varOPERvalue

例如:let count+=3 自加3后自賦值

自增,自減:

let var+=1 或 let var++

let var-=1 或 let var--


bash條件測試

判斷某需求是否滿足,需要由測試機制來實現

專用的測試表達式需要由測試命令輔助完成


測試命令

  • test EXPRESSION
  • [ EXPRESSION ]
  • [[ EXPRESSION ]]   //支持正則

注意:EXPRESSION前后必須有空白字符


測試表達式的類別

  • 數值比較
  • 字符串測試
  • 文件測試

數值比較測試

  • -gt: 是否大於
  • -ge: 是否大於等於
  • -eq: 是否等於
  • -ne: 是否不等於
  • -lt: 是否小於
  • -le: 是否小於等於
[999][root@centos6: /root]# test 1 -gt 3 [1000][root@centos6: /root]# echo $? 1 [1001][root@centos6: /root]# test 1 -lt 3 [1002][root@centos6: /root]# echo $? 0 [1003][root@centos6: /root]# [ 1 -gt 3 ] [1004][root@centos6: /root]# echo $? 1 [1005][root@centos6: /root]# [ 1 -lt 3 ] [1006][root@centos6: /root]# echo $? 0

字符串測試:

  • ==:是否等於;
  • >: ascii碼是否大於ascii碼
  • <: 是否小於
  • !=: 是否不等於
  • =~: 左側字符串是否能夠被右側的PATTERN所匹配

注意: 此表達式一般用於[[ ]]中;擴展的正則表達式

  • -z "STRING":字符串是否為空,空為真,不空為假
  • -n "STRING":字符串是否不空,不空為真,空為假

注意:用於字符串比較時的用到的操作數都應該使用引號

[1007][root@centos6: /root]# name=xiangge [1009][root@centos6: /root]# [ -z "${name}" ] [1010][root@centos6: /root]# echo $? 1 [1011][root@centos6: /root]# [ -z "${myname}" ] [1012][root@centos6: /root]# echo $? 0 [root@centos6: /root]# [ "${myname}" == "${name}" ] [1019][root@centos6: /root]# echo $?

注意以下例子:左則字串要能包含下右側字符串,反之就不行。

[1007][root@centos6: /root]# name=xiangge [1022][root@centos6: /root]# [[ ${name} =~ "xiang" ]] [1023][root@centos6: /root]# echo $? [1026][root@centos6: /root]# [[ "xiang" =~ "${name}" ]] [1026][root@centos6: /root]# echo $? 1

文件測試

存在性測試

  • -a FILE:同-e
  • -e FILE: 文件存在性測試,存在為真,否則為假

存在性及類別測試

  • -b FILE:是否存在且為塊設備文件
  • -c FILE:是否存在且為字符設備文件
  • -d FILE:是否存在且為目錄文件
  • -f FILE:是否存在且為普通文件
  • -h FILE 或 -L FILE:存在且為符號鏈接文件
  • -p FILE:是否存在且為命名管道文件
  • -S FILE:是否存在且為套接字文件

寫一個判斷文件類型的腳本

1#!/bin/bash 2 # 3 # 用戶鍵入路徑,用腳本來判斷文件類型 4 read -p "Enter a file path: " filename 5 if [ -z "$filename" ];then 6 echo "usage: Enter a file path." 7 exit 1 8 fi 9 if [ ! -e $filename ];then 10 echo "NO such file." 11 exit 2 12fi 13if [ -f $filename ];then 14 echo "A common file." 15 elif [ -d $filename ];then 16 echo "A common directory." 17 elif [ -L $filename ];then 18 echo "A symbolic file." 19 else 20 echo "other type." 21 fi

文件權限測試:(當前用戶)

  • -r FILE:是否存在且可讀
  • -w FILE: 是否存在且可寫
  • -x FILE: 是否存在且可執行

文件特殊權限測試:

  • -u FILE:是否存在且擁有suid權限
  • -g FILE:是否存在且擁有sgid權限
  • -k FILE:是否存在且擁有sticky權限

文件大小測試:

  • -s FILE: 是否存在且非空

文件是否打開:

  • -t fd: fd表示文件描述符是否已經打開且與某終端相關
  • -N FILE:文件自動上一次被讀取之后是否被修改過
  • -O FILE:當前有效用戶是否為文件屬主
  • -G FILE:當前有效用戶是否為文件屬組

組合測試條件

第一種方式:

COMMAND1 && COMMAND2 並且 COMMAND1 || COMMAND2 或者 ! COMMAND 非

如:[[ -r FILE ]] && [[ -w FILE ]]

第二種方式: EXPRESSION1 -a EXPRESSION2 並且 EXPRESSION1 -o EXPRESSION2 或者 ! EXPRESSION 必須使用測試命令進行;

[990][root@centos6: /root]# [ -z "$hostName" ] || [ "$hostName" == "centos6.8E" ] [991][root@centos6: /root]# echo $? 0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM