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

bash的算術運算

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

實現算術運算:

  • (1) let var=算術表達式
  • (2) var=$[算術表達式]
  • (3) var=$((算術表達式))
  • (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
12 fi
13 if [ -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

原創文章,作者:祥健,如若轉載,請注明出處:http://www.www58058.com/73626

(0)
祥健祥健
上一篇 2017-04-17
下一篇 2017-04-17

相關推薦

  • linux防火墻規矩管理工具-iptables

    工具:iptables  系統:centos6.8 目錄 一、iptables簡介 二、主機報文流向 三、Netfilite功能 四、Iptables規矩     一、iptables簡介 iptables,一個運行在用戶空間的應用軟件,通過控制Linux內核netfilter模塊,來管理網絡數據包的流動與轉送。通常iptabl…

    2017-02-07
  • iptables入門到進階

    netfilter/iptables:        netfilter是存在于內核中的一個防火墻框架,用來管理網絡數據包,netfilter在IP數據包處理流程中的5個關鍵位置放置了5個鉤子(hook)函數,當數據包流經相應的位置時,相應的鉤子函數會被調用,每個對應的鉤子上有對應的表,表中有對應的…

    Linux干貨 2017-05-02
  • 內核相關

    內核兩大流派單內核微內核 grub分為三個階段:1階段 1.5階段 2階段 內核階段 通過/proc/cmdline找到根并掛載2階段內容是放在/boot/grub目錄下Centos6 實驗:丟失除grub.conf外所有文件沒有修復過的時候/boot/grub下文件是放在磁盤上某個位置的修復過一次后/boot/grub下文件就起作用了,一旦執行過grub-…

    Linux干貨 2018-01-03
  • N22-love cat 博客作業 第3部分

    基于 heartbeat v2 crm 實現HA高可用性的 LAMP+wordpress 基本環境設置 OS   version:       CentOS release 6.7 (Final) Soft versio…

    Linux干貨 2016-08-15
  • 2016.10.12 成為了馬幫的一員!

    未來的6個月內,好好學習天天向上!

    Linux干貨 2016-10-19
  • 用戶,組和權限管理 基礎命令整理

    安全3A任何一個安全策略都應該有Authentication(認證)、Authentication(授權)、Accouting|Audition(審計)這三個措施。 用戶(User)Linux用戶是安全3A中的Authentication(認證)措施。用戶在登錄時,系統會檢查用戶輸入的用戶名和密碼。如果用戶輸入的用戶名和密碼匹配,會根據用戶信息給用戶分配一個…

    Linux干貨 2017-03-16

評論列表(1條)

  • renjin
    renjin 2017-04-21 11:25

    主要介紹了bash編程的測試及算術運算,內容總結的很詳細,排版也很不錯,繼續努力!

欧美性久久久久