Shell 基本運算符

Shell 基本運算符

Shell 和其他編程語言一樣,支持多種運算符,包括:

  • 算數運算符
  • 關系運算符
  • 布爾運算符
  • 字符串運算符
  • 文件測試運算符

原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。

expr 是一款表達式計算工具,使用它能完成表達式的求值操作。

例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '):

實例

#!/bin/bash

val=`expr 2 + 2`
echo "兩數之和為 : $val"


運行實例 ?

執行腳本,輸出結果如下所示:

兩數之和為 : 4

兩點注意:

  • 表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
  • 完整的表達式要被 ` ` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。

算術運算符

下表列出了常用的算術運算符,假定變量 a 為 10,變量 b 為 20:

運算符說明舉例
+加法`expr $a + $b` 結果為?30。
-減法`expr $a - $b` 結果為 -10。
*乘法`expr $a \* $b` 結果為 ?200。
/除法`expr $b / $a` 結果為?2。
%取余`expr $b % $a` 結果為?0。
=賦值a=$b 把變量 b 的值賦給 a。
==相等。用于比較兩個數字,相同則返回 true。[ $a == $b ] 返回?false。
!=不相等。用于比較兩個數字,不相同則返回 true。[ $a != $b ] 返回 true。

注意:條件表達式要放在方括號之間,并且要有空格,例如: [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]

實例

算術運算符實例如下:

實例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
? ?echo "a 等于 b"
fi
if [ $a != $b ]
then
? ?echo "a 不等于 b"
fi

執行腳本,輸出結果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

注意:

  • 乘號(*)前邊必須加反斜杠(\)才能實現乘法運算;
  • if...then...fi 是條件語句,后續將會講解。
  • 在 MAC 中 shell 的 expr 語法是:$((表達式)),此處表達式中的 "*" 不需要轉義符號 "\" 。

關系運算符

關系運算符只支持數字,不支持字符串,除非字符串的值是數字。

下表列出了常用的關系運算符,假定變量 a 為 10,變量 b 為 20:

運算符說明舉例
-eq檢測兩個數是否相等,相等返回 true。[ $a -eq $b ] 返回?false。
-ne檢測兩個數是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt檢測左邊的數是否大于右邊的,如果是,則返回 true。[ $a -gt $b ] 返回 false。
-lt檢測左邊的數是否小于右邊的,如果是,則返回 true。[ $a -lt $b ] 返回 true。
-ge檢測左邊的數是否大于等于右邊的,如果是,則返回 true。[ $a -ge $b ] 返回 false。
-le檢測左邊的數是否小于等于右邊的,如果是,則返回 true。[ $a -le $b ] 返回 true。

實例

關系運算符實例如下:

實例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

if [ $a -eq $b ]
then
? ?echo "$a -eq $b : a 等于 b"
else
? ?echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
? ?echo "$a -ne $b: a 不等于 b"
else
? ?echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
? ?echo "$a -gt $b: a 大于 b"
else
? ?echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
? ?echo "$a -lt $b: a 小于 b"
else
? ?echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
? ?echo "$a -ge $b: a 大于或等于 b"
else
? ?echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
? ?echo "$a -le $b: a 小于或等于 b"
else
? ?echo "$a -le $b: a 大于 b"
fi

執行腳本,輸出結果如下所示:

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

布爾運算符

下表列出了常用的布爾運算符,假定變量 a 為 10,變量 b 為 20:

運算符說明舉例
!非運算,表達式為 true 則返回 false,否則返回 true。[ ! false ] 返回 true。
-o或運算,有一個表達式為 true 則返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回?true。
-a與運算,兩個表達式都為 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回?false。

實例

布爾運算符實例如下:

實例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

if [ $a != $b ]
then
? ?echo "$a != $b : a 不等于 b"
else
? ?echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
? ?echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
? ?echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
? ?echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
? ?echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
? ?echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
? ?echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

執行腳本,輸出結果如下所示:

10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false

邏輯運算符

以下介紹 Shell 的邏輯運算符,假定變量 a 為 10,變量 b 為 20:

運算符說明舉例
&&邏輯的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||邏輯的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true

實例

邏輯運算符實例如下:

實例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a=10
b=20

if [[ $a -lt 100 && $b -gt 100 ]]
then
? ?echo "返回 true"
else
? ?echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
? ?echo "返回 true"
else
? ?echo "返回 false"
fi

執行腳本,輸出結果如下所示:

返回 false
返回 true

字符串運算符

下表列出了常用的字符串運算符,假定變量 a 為 "abc",變量 b 為 "efg":

運算符說明舉例
=檢測兩個字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=檢測兩個字符串是否不相等,不相等返回 true。[ $a != $b ] 返回?true。
-z檢測字符串長度是否為0,為0返回 true。[ -z $a ] 返回 false。
-n檢測字符串長度是否不為 0,不為 0 返回 true。[ -n "$a" ] 返回 true。
$檢測字符串是否不為空,不為空返回 true。[ $a ] 返回?true。

實例

字符串運算符實例如下:

實例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

a="abc"
b="efg"

if [ $a = $b ]
then
? ?echo "$a = $b : a 等于 b"
else
? ?echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
? ?echo "$a != $b : a 不等于 b"
else
? ?echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
? ?echo "-z $a : 字符串長度為 0"
else
? ?echo "-z $a : 字符串長度不為 0"
fi
if [ -n "$a" ]
then
? ?echo "-n $a : 字符串長度不為 0"
else
? ?echo "-n $a : 字符串長度為 0"
fi
if [ $a ]
then
? ?echo "$a : 字符串不為空"
else
? ?echo "$a : 字符串為空"
fi

執行腳本,輸出結果如下所示:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串長度不為 0
-n abc : 字符串長度不為 0
abc : 字符串不為空

文件測試運算符

文件測試運算符用于檢測 Unix 文件的各種屬性。

屬性檢測描述如下:

操作符說明舉例
-b file檢測文件是否是塊設備文件,如果是,則返回 true。[ -b $file ] 返回 false。
-c file檢測文件是否是字符設備文件,如果是,則返回 true。[ -c $file ] 返回?false。
-d file檢測文件是否是目錄,如果是,則返回 true。[ -d $file ] 返回 false。
-f file檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。[ -f $file ] 返回?true。
-g file檢測文件是否設置了 SGID 位,如果是,則返回 true。[ -g $file ] 返回?false。
-k file檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。[ -k $file ] 返回?false。
-p file檢測文件是否是有名管道,如果是,則返回 true。[ -p $file ] 返回?false。
-u file檢測文件是否設置了 SUID 位,如果是,則返回 true。[ -u $file ] 返回?false。
-r file檢測文件是否可讀,如果是,則返回 true。[ -r $file ] 返回?true。
-w file檢測文件是否可寫,如果是,則返回 true。[ -w $file ] 返回?true。
-x file檢測文件是否可執行,如果是,則返回 true。[ -x $file ] 返回?true。
-s file檢測文件是否為空(文件大小是否大于0),不為空返回 true。[ -s $file ] 返回?true。
-e file檢測文件(包括目錄)是否存在,如果是,則返回 true。[ -e $file ] 返回?true。

其他檢查符:

  • -S: 判斷某文件是否 socket。
  • -L: 檢測文件是否存在并且是一個符號鏈接。

?

實例

變量 file 表示文件 /var/www/runoob/test.sh,它的大小為 100 字節,具有 rwx 權限。下面的代碼,將檢測該文件的各種屬性:

實例

#!/bin/bash
# author:菜鳥教程
# url:www.runoob.com

file="/var/www/runoob/test.sh"
if [ -r $file ]
then
? ?echo "文件可讀"
else
? ?echo "文件不可讀"
fi
if [ -w $file ]
then
? ?echo "文件可寫"
else
? ?echo "文件不可寫"
fi
if [ -x $file ]
then
? ?echo "文件可執行"
else
? ?echo "文件不可執行"
fi
if [ -f $file ]
then
? ?echo "文件為普通文件"
else
? ?echo "文件為特殊文件"
fi
if [ -d $file ]
then
? ?echo "文件是個目錄"
else
? ?echo "文件不是個目錄"
fi
if [ -s $file ]
then
? ?echo "文件不為空"
else
? ?echo "文件為空"
fi
if [ -e $file ]
then
? ?echo "文件存在"
else
? ?echo "文件不存在"
fi

執行腳本,輸出結果如下所示:

文件可讀
文件可寫
文件可執行
文件為普通文件
文件不是個目錄
文件不為空
文件存在

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39795.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HuggingFace開源的自然語言處理AI工具平臺

HuggingFace是一個開源的自然語言處理AI工具平臺,它為NLP的開發者和研究者提供了一個簡單、快速、高效、可靠的解決方案,讓NLP變得更加簡單、快速、高效、可靠。 Hugging Face平臺主要包括以下幾個部分: Transformers:一個提供了…

期權定價模型系列【5】—ETF期權數據

1.前言 對期權定價模型進行研究時,往往需要匹配的實際數據,國內上市時間超過兩年、主流的ETF期權包括華夏上證50ETF期權、滬深300ETF期權等,其對應的標的資產分別為華夏上證50ETF、華泰柏瑞滬深300ETF、嘉實滬深300ETF。 2.上證50ETF期權合約…

淺析基于視頻匯聚與AI智能分析的新零售方案設計

一、行業背景 近年來,隨著新零售概念的提出,國內外各大企業紛紛布局智慧零售領域。從無人便利店、智能售貨機,到線上線下融合的電商平臺,再到通過大數據分析實現精準推送的個性化營銷,智慧零售的觸角已經深入各個零售…

數組常用方法總結

數組常用方法總結 一.獲取數組長度1.1 使用length 二.數組轉字符串2.1 Arrays是什么2.2 使用toString() 三. 數組拷貝3.1 使用 copyOf()3.2 copyOfRange() 四.數組排序4.1使用 sort() 五. 數組逆序六. 判斷兩個數組是否相等6.1 使用equals() 一.獲取數組長度 1.1 使用length p…

ArrayList

目錄 1.ArrayList簡介 2.ArrayList的構造 2.1ArrayList() 2.2ArrayList(Collection c) 2.3ArrayList(int initialCapacity) 3.ArrayList常見操作 4.ArrayList的遍歷的遍歷 1.ArrayList簡介 在集合框架中, ArrayList 是一個普通的類,實現了 List…

【jenkins】jenkins流水線構建打包jar,生成docker鏡像,重啟docker服務的過程,在jenkins上一鍵完成,實現提交代碼自動構建的功能

【jenkins】jenkins流水線構建打包jar,生成docker鏡像,重啟docker服務的過程,在jenkins上一鍵完成,實現提交代碼自動構建,服務重啟,服務發布的功能。一鍵實現。非常的舒服。 1. 啟動腳本 shell腳本 這是 s…

MySQL 中 不等于 會過濾掉 Null 的問題

null值與任意值比較時都為fasle not in 、"!"、"not like"條件過濾都會過濾掉null值的數據 SELECT * from temp; SELECT * from temp where score not in (70); 返回null解決方法: SELECT * from temp where score not in (70) or score is null;SELECT…

迅捷視頻工具箱:多功能音視頻處理軟件

這是一款以視頻剪輯、視頻轉換、屏幕錄像等特色功能為主,同時附帶有視頻壓縮、視頻分割、視頻合并等常用視頻處理功能為主的視頻編輯軟件。該軟件操作簡單易用,即使沒有視頻處理經驗的用戶也可以輕松上手。將視頻添加到工具箱對應功能后,簡單…

zookeeper-安裝部署

詳情可以查看添加鏈接描述 1.安裝jdk apt-get install openjdk-8-jdk2.安裝單機zookeeper # 下載 #https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1.tar.gz # 用這個包啟動的時候會報錯Error: Could not find or load main class org.apach…

【OFDM系列】DFT為什么能求頻率幅度譜?DFT后的X[k]與x(n)幅度的關系?DFT/IDFT底層數學原理?

文章目錄 問題引入鋪墊一些小公式DFT公式證明DFT公式分解為4部分先考慮k10的情況:再考慮k1≠0的情況: DFT計算后,X(k)與x(n)的關系: Matlab FFT示例代碼IDFT公式證明Matlab調用FFT/IFFT并繪圖 問題引入 上面是DFT和IDFT的公式,IDFT先不談。在…

django實現文件上傳

在django中實現文件上傳有三種方法可以實現: 自己手動寫使用Form組件使用ModelForm組件 其中使用ModelForm組件實現是最簡單的。 1、自己手寫 先寫一個上傳的頁面 upload_file.html enctype"multipart/form-data 一定要加這個,不然只會上傳文件名…

HTTPS 的加密流程

目錄 一、HTTPS是什么? 二、為什么要加密 三、"加密" 是什么 四、HTTPS 的工作過程 1.對稱加密 2.非對稱加密 3.中間人攻擊 4.證書 總結 一、HTTPS是什么? HTTPS (Hyper Text Transfer Protocol Secure) 是基于 HTTP 協議之上的安全協議&…

四、Controller 配置總結、RestFul 風格

文章目錄 一、Controller 配置總結二、RestFul 風格2.1 使用 RequestMapping 的 method 屬性指定請求類型 三、擴展:小黃鴨調試法 一、Controller 配置總結 實現 Controller 控制器的方式 實現 Controller 接口,重寫 handleRequest 方法實現 控制器實現 …

Markdown編輯器 Mac版Typora功能介紹

Typora mac是一款跨平臺的Markdown編輯器,支持Windows、MacOS和Linux操作系統。它具有實時預覽功能,能夠自動將Markdown文本轉換為漂亮的排版效果,讓用戶專注于寫作內容而不必關心格式調整。 Typora Mac版除了支持常見的Markdown語法外&#…

騰訊云輕量服務器測評:2核 2G 4M

騰訊云輕量2核2G4M服務器,4M帶寬下載速度可達512KB/秒,系統盤為50GB SSD盤,300GB月流量,地域節點可選上海、廣州和北京,騰訊云百科分享騰訊云2核2G4M輕量應用服務器配置性能表: 目錄 騰訊云輕量2核2G4M服…

Linux下使用Ffmpeg循環推流

#前臺運行 ffmpeg -stream_loop -1 -re -i "/usr/local/mp4/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://10.55.134.12/live/test#后臺運行 nohup ffmpeg -stream_loop -1 -re -i "/usr/local/mp4/test.mp4" -vcodec h264 -ac…

爬蟲逆向實戰(十五)--阿某某營登錄

一、數據接口分析 主頁地址:阿某某營 1、抓包 通過抓包可以發現登錄接口是Users/Login 2、判斷是否有加密參數 請求參數是否加密? 通過查看“載荷”模塊可以發現有一個s加密參數 請求頭是否加密? 無響應是否加密? 無cookie是…

【LangChain】P1 LangChain 應用程序的核心構建模塊 LLMChain 以及其三大部分

LangChain 的核心構建模塊 LLMChain LangChain 應用程序的核心構建模塊語言模型 - LLMs提示模板 - Prompt templates輸出解析器 - Output Parsers LLMChain 組合 LangChain 應用程序的核心構建模塊 LangChain 應用程序的核心構建模塊 LLMChain 由三部分組成: 語言…

電腦鍵盤打不了字按哪個鍵恢復?最新分享!

“有沒有朋友知道電腦鍵盤為什么會莫名其妙就打不了字?明明用得好好的,突然就打不了字了,真的讓人很迷惑!有什么方法可以解決嗎?” 電腦鍵盤為我們的辦公提供了很大的方便,我們可以利用鍵盤輸入我們需要的文…

安防監控視頻云存儲平臺EasyCVRH.265轉碼功能更新:新增分辨率配置

安防視頻集中存儲EasyCVR視頻監控綜合管理平臺可以根據不同的場景需求,讓平臺在內網、專網、VPN、廣域網、互聯網等各種環境下進行音視頻的采集、接入與多端分發。在視頻能力上,視頻云存儲平臺EasyCVR可實現視頻實時直播、云端錄像、視頻云存儲、視頻存儲…