主頁 > 作業系統 > linux bash算術運算和條件陳述句

linux bash算術運算和條件陳述句

2020-10-01 11:56:27 作業系統

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

  • let var=算術運算子運算式

    高級let用法:let i+=2

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

    自增:let var++

  • var=$[算術運算子運算式]

  • var=$((算術運算子運算式))

  • var=$(expr $ARG1 OP $APG2)

</font color=red>注意:乘法符號在某些場景中需要使用轉義符

練習1:寫一個腳本檔案,完成如下功能:添加3個用戶,求這3個用戶的UID之和,

#!/bin/bash

id testUser1 > /dev/null || useradd testUser1
id testUser2 > /dev/null || useradd testUser2
id testUser3 > /dev/null || useradd testUser3

uid1=`grep "testUser1" /etc/passwd | cut -d: -f3`
uid2=`grep "testUser2" /etc/passwd | cut -d: -f3`
uid3=$(grep "testUser3" /etc/passwd | cut -d: -f3)

#方法1
#let num=$uid1+$uid2+$uid3
#方法2
#num=$[$uid1+$uid2+$uid3]
#方法3
num=$(($uid1+$uid2+$uid3))
#方法4
#num=$(expr $uid1 + $uid2 + $uid3)
echo $num

練習2:寫一個腳本檔案,完成如下功能:求/etc/passwd檔案中第10行和第20行的用戶的UID之和

#!/bin/bash

#先用head取前10行,再用tail取最好一行,然后再用cut切
la=`head -10 /etc/passwd | tail -1 | cut -d: -f3`
lb=`head -20 /etc/passwd | tail -1 | cut -d: -f3`

echo $la
echo $lb

let lc=$la+$lb
echo $lc

練習3:寫一個腳本檔案,完成如下功能:求/etc/passwd檔案中,uid最大的2個uid之和

#!/bin/bash

#先用冒號把檔案分成多列,用第三列從大到小排序后,分別取第一行和第二行,最后在用cut切開
la=`sort -t: -k3 -nr /etc/passwd | head -1 | cut -d: -f3`
lb=`sort -t: -k3 -nr /etc/passwd | head -2 | tail -1 | cut -d: -f3`

echo $la
echo $lb

let lc=$la+lb
echo $lc

練習4:寫一個腳本檔案,完成如下功能:通知2個檔案里的空白行數之和

#!/bin/bash

#用grep找出空白行(使用正則運算式),然后再用wc數一數有多少行
la=`grep -e "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l`
lb=`grep -e "^[[:space:]]*$" /etc/inittab | wc -l`

echo $la
echo $lb

let lc=$la+$lb
echo $lc

條件陳述句

測驗運算式:

  • test expression
  • [ expression ]
  • [[ expression ]]

注意:中括號中間的空格,沒有空格就是語法錯誤

bash的條件測驗型別

  • 數值比較大小

    • -eq:等于 [ $num1 -eq $num2 ]
    • -ne:不等于[ $num1 -ne $num2 ]
    • -gt:大于[ $num1 -gt $num2 ]
    • -ge:大于等于[ $num1 -ge $num2 ]
    • -lt:小于[ $num1 -lt $num2 ]
    • -le:小于等于[ $num1 -le $num2 ]

    例子:[ 2 -ne 3 ]和test 2 -ne 3效果一樣

    #!/bin/bash
    
    if [ 2 -ne 3 ]; then
        echo 11
    else
        echo 22
    fi
    
    if test 2 -ne 3; then
        echo 111
    else
        echo 222
    fi
    
  • 字串比較

    == :等于

    > :大于

    < :小于

    != :不等于

    =~ :左側字串是否被右側的正則運算式所匹配,

    -z "STRING" :指定字串為空則為真

    -n "STRING":指定字串不為空則為真

    做字串比較的變數,最好加上“”,不加的話,如果做比較的某個變數沒有被定義的話,執行就會出錯,

    下面的例子,tom是不存在的變數,不加括號就出錯誤了,加了就沒有錯誤,

    $ [ tom = $tom ]
    -bash: [: tom: unary operator expected
    $ [ tom = "$tom" ]
    $ echo $?
    1
    

    字串比較,最好要用[[]],

    下面的例子,說明了用[]無法比較

    $ [ a > b ]
    $ echo $?
    0
    $ [ a < b ]
    $ echo $?
    0
    $ [ "a" < "b" ]
    $ echo $?
    0
    $ [ "a" > "b" ]
    $ echo $?
    0
    

    下面的例子,說明用[[ ]]達到了預期,

    $ [[ a < b ]]
    $ echo $?
    0
    $ [[ a > b ]]
    $ echo $?
    1
    $ [[ "a" > "b" ]]
    $ echo $?
    1
    $ [[ "a" < "b" ]]
    $ echo $?
    0
    

    字串空的判斷:

    $ [[ -z "$tom" ]]
    $ echo $?
    1
    [ys@localhost ~]$ [[ -n "$tom" ]]
    [ys@localhost ~]$ echo $?
    
    

    正則運算式的匹配:

    $ tom=ooo
    [ys@localhost ~]$ [[ $tom =~ o.* ]]
    [ys@localhost ~]$ echo $?
    0
    [ys@localhost ~]$ tom=jerry
    [ys@localhost ~]$ [[ $tom =~ o.* ]]
    [ys@localhost ~]$ echo $?
    1
    
  • 檔案測驗

    • 檔案存在性檢查:-a FILE,或者,-e FILE,存在回傳0.

      例子:[ -a /etc/passwd ][ -e /etc/passwd ]

    • 檔案存在性和型別檢查

      -b FILE:檔案存在,且型別是塊設備,則回傳0.

      -c FILE:檔案存在,且型別是字符設備,則回傳0.

      -d FILE:檔案存在,且型別是目錄,則回傳0.

      -f FILE:檔案存在,且型別是普通檔案,則回傳0.

      -h或 -L FILE:檔案存在,且型別是符號鏈接,則回傳0.

      -p FILE:檔案存在,且型別是命名管道,則回傳0.

      -S FILE:檔案存在,且型別是本地套接字,則回傳0.

      $ [ -b /dev/sda ]
      [ys@localhost scripts]$ echo $?
      0
      [ys@localhost scripts]$ [ -b /dev/sdad ]
      [ys@localhost scripts]$ echo $?
      1
      [ys@localhost scripts]$ [ -b 2.sh ]
      [ys@localhost scripts]$ echo $?
      1
      
    • 檔案權限檢查

      -r FILE:檔案存在,且當前用戶(運行此shell行程的用戶)可讀,則回傳0.

      -w FILE:檔案存在,且當前用戶(運行此shell行程的用戶)可寫,則回傳0.

      -x FILE:檔案存在,且當前用戶(運行此shell行程的用戶)可執行,則回傳0.

    • 特殊權限檢查

      -u FILE:檔案存在,且擁有suid權限,則回傳0.

      -g FILE:檔案存在,且擁有sgid權限,則回傳0.

      -k FILE:檔案存在,且擁有sticky權限,則回傳0.

    • 檔案是否有內容

      -s FILE:檔案存在,且有內容,則回傳0

    • 時間戳

      -N FILE:檔案自從上一次讀取操作后,是否被修改過,

    • 從屬關系

      -O FILE:當前用戶是否檔案屬主

      -G FILE:當前用戶是否在檔案屬組里,

    • 雙目

      FILE1 -ef FILE2:如果FILE1和FILE2是指向同一個檔案系統的相同inode的硬鏈接,則回傳0.

      FILE1 -nt FILE2:如果FILE1的修改時間戳新于FILE,則回傳0

      FILE 1 -ot FILE2:如果FILE1的修改時間戳舊于FILE,則回傳0

組合測驗條件

第一種方式:

  • [ expression1 ] && [ expression2 ]
  • [ expression1 ] || [ expression2 ]
  • ! COMMOND

第二種方式:

  • 與運算:[ expression1 -a expression2 ]
  • 或運算:[ expression1 -o expression2 ]

練習:判斷主機名稱是否為空,或者是否是localhost.localdomain

#!/bin/bash

hostname=`hostname`
if [ -z "$hostname" -o "$hostname" == "localhost.localdomain" ]; then
    hostname=11111
else
    echo "ng"
fi
echo $hostname

向腳本檔案傳遞執行時候的引數

使用位置引數變數:$1,$2,...${10},${11}.

10之后的引數必須加上{},

$0:是腳本本身的路徑加腳本檔案的名字,

$#:是引數的個數

$*:拿到所有引數,但把所有引數匯總成了一個串

$@:拿到所有引數,但沒有把引數匯總成一個串,

當執行下面命令后,$1的值就是111;$2的值就是222;$3的值就是333;

$ ./script.sh 111 222 333

shift用法:shift n:踢掉前n個位置引數變數

下面的內容保存在shift.sh中

#!/bin/bash
echo $1 $2
shift 1
echo $1
shift 1
echo $1

執行shift.sh的結果:

# bash shift.sh 111 222 333
111 222
222
333

練習:傳遞2個文本檔案的路徑給腳本,計算出空白行數之和,

#!/bin/bash
la=`grep -e "^[[:space:]]*$" $1 | wc -l`
lb=`grep -e "^[[:space:]]*$" $2 | wc -l`
echo $la
echo $lb

let lc=$la+$lb
echo $lc

執行結果:

# bash sumforarg.sh /etc/rc.d/init.d/functions /etc/inittab
91
0
91

if語法

if  con1 ; then

elif con2 ; then

else

fi

練習:查看給定用戶是否存在,不存在則創建此用戶,

#!/bin/bash

if ! grep "^$1\>" /etc/passwd &> /dev/null ; then
    useradd $1
    # 設定用戶$1的密碼是111
    echo "111" | passwd --stdin $1 &> /dev/null
    echo "add user $1 donw!"
fi

練習:比較2個數字的大小

#!/bin/bash

#宣告一個變數,是整數,
declare -i max
#引數個數小于2
if [ $# -lt 2 ]; then
    echo "at least one argu"
    exit 1
fi
#引數1大于引數2
if [ $1 -ge $2 ]; then
    max=$1
else
    max=$2
fi
echo "max number is $max"

練習:判斷給定用戶名的id號是奇數還是偶數

#!/bin/bash

if [ $# -lt 1 ]; then
    echo "at least one argu"
    exit 1
fi

#取得用戶的id
uid=$(grep "^$1\>" /etc/passwd | cut -d: -f3)
echo $uid

#判斷奇偶數
if [ $[$uid % 2] -eq 0 ]; then
    echo "oushu"
else
    echo "jishu"
fi

運行結果:

# bash jigou.sh ys
1000
oushu
# bash jigou.sh fedora
1005
jishu

練習:給2個文本檔案路徑,如果檔案不存在,則結束腳本;都存在則回傳每個檔案的行數,并找出行數多的檔案

#!/bin/bash

if [ $# -lt 2 ]; then
    echo "at least two argu"
    exit 1
fi

if ! [ -e $1 -a -e $2 ]; then
    exit 1
else
    la=`wc -l < $1`
    lb=`wc -l < $2`

    echo "$1 行數:$la;$2 行數:$lb"
    if [ $la -ge $lb ]; then
        echo "$1 行數多"
    else
        echo "$2 行數多"
    fi

fi

運行結果:

# bash sum1.sh /etc/passwd /etc/fstab
/etc/passwd 行數:56;/etc/fstab 行數:13
/etc/passwd 行數多

case語法

case $var in
    pat1)

        ;;
    pat2)

        ;;
    pat3)

        ;;
    *)

        ;;
esac

pat支持globbing風格:

  • *:匹配任意長度的任意字符
  • ?:匹配任意單個字符
  • []:匹配指定范圍內的任意單個字符
  • [^]:匹配指定范圍外的任意單個字符
  • {}:表示符合括號內包含的多個檔案
  • aaa|bbb:aaa或bbb

執行完腳本檔案后,回傳值是啥?

默認是腳本檔案里最后一條命令的回傳值,

可以自定義回傳值:使用exit n命令,n為數字,

當shell行程遇到exit命令時,行程會立即終止,因此exit后面的命令就不執行了,

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/145040.html

標籤:Linux

上一篇:Linux 學習筆記 1 使用最小的系統,從磁區安裝系統開始

下一篇:LAMP環境搭建和配置(2)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • CA和證書

    1、在 CentOS7 中使用 gpg 創建 RSA 非對稱密鑰對 gpg --gen-key #Centos上生成公鑰/密鑰對(存放在家目錄.gnupg/) 2、將 CentOS7 匯出的公鑰,拷貝到 CentOS8 中,在 CentOS8 中使用 CentOS7 的公鑰加密一個檔案 gpg -a ......

    uj5u.com 2020-09-10 00:09:53 more
  • Kubernetes K8S之資源控制器Job和CronJob詳解

    Kubernetes的資源控制器Job和CronJob詳解與示例 ......

    uj5u.com 2020-09-10 00:10:45 more
  • VMware下安裝CentOS

    VMware下安裝CentOS 一、軟硬體準備 1 Centos鏡像準備 1.1 CentOS鏡像下載地址 下載地址 1.2 CentOS鏡像下載程序 點擊下載地址進入如下圖的網站,選擇需要下載的版本,這里選擇的是Centos8,點擊如圖所示。 決定選擇Centos8后,選擇想要的鏡像源進行下載,此 ......

    uj5u.com 2020-09-10 00:12:10 more
  • 如何使用Grep命令查找多個字串

    如何使用Grep 命令查找多個字串 大家好,我是良許! 今天向大家介紹一個非常有用的技巧,那就是使用 grep 命令查找多個字串。 簡單介紹一下,grep 命令可以理解為是一個功能強大的命令列工具,可以用它在一個或多個輸入檔案中搜索與正則運算式相匹配的文本,然后再將每個匹配的文本用標準輸出的格式 ......

    uj5u.com 2020-09-10 00:12:28 more
  • git配置http代理

    git配置http代理 經常遇到克隆 github 慢的問題,這里記錄一下幾種配置 git 代理的方法,解決 clone github 過慢。 目錄 git配置代理 git單獨配置github代理 git配置全域代理 配置終端環境變數 git配置代理 主要使用 git config 命令 git單獨 ......

    uj5u.com 2020-09-10 00:12:33 more
  • Linux npm install 裝包時提示Error EACCES permission denied解

    npm install 裝包時提示Error EACCES permission denied解決辦法 ......

    uj5u.com 2020-09-10 00:12:53 more
  • Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包

    Centos 7下安裝nginx,使用yum install nginx,提示沒有可用的軟體包。 18 (flaskApi) [root@67 flaskDemo]# yum -y install nginx 19 已加載插件:fastestmirror, langpacks 20 Loading ......

    uj5u.com 2020-09-10 00:13:13 more
  • Linux查看服務器暴力破解ssh IP

    在公網的服務器上經常遇到別人爆破你服務器的22埠,用來挖礦或者干其他嘿嘿嘿的事情~ 這種情況下正確的做法是: 修改默認ssh的22埠 使用設定密鑰登錄或者白名單ip登錄 建議服務器密碼為復雜密碼 創建普通用戶登錄服務器(root權限過大) 建立堡壘機,實作統一管理服務器 統計爆破IP [root ......

    uj5u.com 2020-09-10 00:13:17 more
  • CentOS 7系統常見快捷鍵操作方式

    Linux系統中一些常見的快捷方式,可有效提高操作效率,在某些時刻也能避免操作失誤帶來的問題。 ......

    uj5u.com 2020-09-10 00:13:31 more
  • CentOS 7作業系統目錄結構介紹

    作業系統存在著大量的資料檔案資訊,相應檔案資訊會存在于系統相應目錄中,為了更好的管理資料資訊,會將系統進行一些目錄規劃,不同目錄存放不同的資源。 ......

    uj5u.com 2020-09-10 00:13:35 more
最新发布
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:43:21 more
  • vim的常用命令

    Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,洗掉文本等等。這也是Vim啟動后的默認模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器默認模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩沖中插入文本。大多數新用戶希望文本編輯器編輯程序中一 ......

    uj5u.com 2023-04-20 08:42:36 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:26:53 more
  • 設定Windows主機的瀏覽器為wls2的默認瀏覽器

    這里以Chrome為例。 1. 準備作業 wsl是可以使用Windows主機上安裝的exe程式,出于安全考慮,默認情況下改功能是無法使用。要使用的話,終端需要以管理員權限啟動。 我這里以Windows Terminal為例,介紹如何默認使用管理員權限打開終端,具體操作如下圖所示: 2. 操作 wsl ......

    uj5u.com 2023-04-19 09:25:49 more
  • docker學習

    ###Docker概述 真實專案部署環境可能非常復雜,傳統發布專案一個只需要一個jar包,運行環境需要單獨部署。而通過Docker可將jar包和相關環境(如jdk,redis,Hadoop...)等打包到docker鏡像里,將鏡像發布到Docker倉庫,部署時下載發布的鏡像,直接運行發布的鏡像即可。 ......

    uj5u.com 2023-04-19 09:19:04 more
  • Linux學習筆記

    IP地址和主機名 IP地址 ifconfig可以用來查詢本機的IP地址,如果不能使用,可以通過install net-tools安裝。 Centos系統下ens33表示主網卡;inet后表示IP地址;lo表示本地回環網卡; 127.0.0.1表示代指本機;0.0.0.0可以用于代指本機,同時在放行設 ......

    uj5u.com 2023-04-18 06:52:01 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:50 more
  • 解決linux系統的kdump服務無法啟動的問題

    問題:專案麒麟系統服務器的kdump服務無法啟動,沒有相關日志無法定位問題。 1、查看服務狀態是關閉的,重啟系統也無法啟動 systemctl status kdump 2、修改grub引數,修改“crashkernel”為“512M(有的機器數值太大太小都會導致報錯,建議從128M開始試,或者加個 ......

    uj5u.com 2023-04-12 09:59:01 more
  • 你是不是暴露了?

    作者:袁首京 原創文章,轉載時請保留此宣告,并給出原文連接。 如果您是計算機相關從業人員,那么應該經歷不止一次網路安全專項檢查了,你肯定是收到過資訊系統技術檢測報告,要求你加強風險監測,確保你提供的系統服務堅實可靠了。 沒檢測到問題還好,檢測到問題的話,有些處理起來還是挺麻煩的,尤其是線上正在運行的 ......

    uj5u.com 2023-04-05 16:52:56 more
  • 細節拉滿,80 張圖帶你一步一步推演 slab 記憶體池的設計與實作

    1. 前文回顧 在之前的幾篇記憶體管理系列文章中,筆者帶大家從宏觀角度完整地梳理了一遍 Linux 記憶體分配的整個鏈路,本文的主題依然是記憶體分配,這一次我們會從微觀的角度來探秘一下 Linux 內核中用于零散小記憶體塊分配的記憶體池 —— slab 分配器。 在本小節中,筆者還是按照以往的風格先帶大家簡單 ......

    uj5u.com 2023-04-05 16:44:11 more