shell 的條件表達式及邏輯操作符簡單介紹

来源:https://www.cnblogs.com/su-root/archive/2019/02/18/10328427.html
-Advertisement-
Play Games

查看系統的shell: cat /etc/shells 文件測試表達式: -f 文件 文件存在且為普通文件則真,即測試表達式成立。 -d 文件 文件存在且為目錄文件則真,即測試表達式成立。 -s 文件 文件存在且文件大小不為0則真,即測試表達式成立。 -e 文件 文件存在則真,即測試表達式成立。只要 ...


查看系統的shell:

cat /etc/shells

文件測試表達式:

  -f 文件  文件存在且為普通文件則真,即測試表達式成立。

  -d 文件  文件存在且為目錄文件則真,即測試表達式成立。

  -s 文件  文件存在且文件大小不為0則真,即測試表達式成立。

  -e 文件  文件存在則真,即測試表達式成立。只要有文件就行,要區別 -f 。

  -r 文件  文件存在且可讀則真,即測試表達式成立。

  -w 文件 文件存在且可寫則真,即測試表達式成立。

  -x 文件  文件存在且可執行則真,即測試表達式成立。

  -L 文件   文件存在且為鏈接文件則真,即測試表達式成立。

  a –nt b    文件a比文件b新則真,即測試表達式成立,根據文件修改時間來計算

  a –nt b    文件a比文件b舊則真,即測試表達式成立,根據文件修改時間來計算

特別說明:這些操作符號對於[[]]、[]、test幾乎是通用的,更多的操作符請man test查詢。

普通文件測試表達式:

[root@lamp01 ~]# mkdir bqh1
[root@lamp01 ~]# ll -d ./bqh1
drwxr-xr-x. 2 root root 4096 1月  27 21:51 ./bqh1
[root@lamp01 ~]# [ -d bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -f bqh1.log ]&&echo 1||echo 0
0
[root@lamp01 ~]# touch ./bqh1.log
[root@lamp01 ~]# [ -f bqh1.log ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -e bqh1.log ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -e bqh2.log ]&&echo 1||echo 0
[root@lamp01 ~]# [ -r bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -w bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -x bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# chmod 000 bqh1
[root@lamp01 ~]# ll
d---------. 2 root root  4096 1月  27 21:51 bqh1
[root@lamp01 ~]# [ -x bqh1 ]&&echo 1||echo 0
1

提示:文件的讀寫執行等屬性,不光是根據文件屬性,而是當前執行腳本的用戶根據測試選項是否真的可操作。

測試shell變數舉例:

[root@lamp01 ~]# a=/etc/services
[root@lamp01 ~]# b=/etc/
[root@lamp01 ~]# [ -f $a ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -d $a ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -d $b ]&&echo 1||echo 0
1

特殊例子:如果變數不加雙引號,測試結果可能不正確。

[root@lamp01 ~]# echo $c
[root@lamp01 ~]# [ -f "$c" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -f $c ]&&echo 1||echo 0
1    #$c明明不存在的,卻返回1

使用條件表達式時,多個返回值時,可以使用大括弧的用法,格式如下:

當條件不成立就會執行大括弧內的所有命令內容:

[root@lamp01 ~]# [ 1 -ne 1 ]||{ echo "my name is bqh" ; echo "my name is jyw" ;}
my name is bqh
my name is jyw
[root@lamp01 ~]# 

字元串測試表達式:

  字元串測試操作符:

  -z “字元串”               若串長度為0則真

  -n ”字元串“               若串長度不為0則真

  “字元串1”=“字元串2”     若串1等於串2則真,可以使用‘==’代替‘=’

  “字元串1”!=“字元串2”    若串1不等於串2則真,但不能用‘!==’代替‘!=’

 測試如下:

[root@lamp01 ~]# [ -n "abc" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -n "" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -z "" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -z "abc" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ ! -z "abc" ]&&echo 1||echo 0
1
[root@lamp01 ~]# a="bqh"
[root@lamp01 ~]# [ -n "$a" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -z $a ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ ! -z $a ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ "$a" != "bqh1" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ "$a" = "bqh1" ]&&echo 1||echo 0
0

等號兩端空格帶來的問題:

[root@lamp01 ~]# [ "abc"="1" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ "abc" = "1" ]&&echo 1||echo 0
0

不加引號帶來的問題:

[root@lamp01 ~]# a=""
[root@lamp01 ~]# [ $a = abc  ]&&echo 1||echo 0
-bash: [: =: unary operator expected
0
[root@lamp01 ~]# [ $a = "abc"  ]&&echo 1||echo 0
-bash: [: =: unary operator expected
0
[root@lamp01 ~]# [ "$a" = "abc"  ]&&echo 1||echo 0
0
[root@lamp01 ~]# 

特別註意:

1.比較符合兩端有空格。

2.字元串測試操作符號務必要用“”引起來。

整數表達式:

  -eq:      ==或=                測試兩個整數是否相等;比如 $A -eq $B

  -ne:       !=                 測試兩個整數是否不等;不等,為真;相等,為假;

  -gt:        >                測試一個數是否大於另一個數;大於,為真;否則,為假;

  -lt:        <                測試一個數是否小於另一個數;小於,為真;否則,為假;

  -ge:        >=                 大於或等於

  -le:       <=                 小於或等於

 在使用中中註意:

1、[]及test中使用字母模式。

2、在 (()) 和 [[]] 中使用符合模式。

提示:

 “<”符號意思是小於,if[[ "$a" < "$b" ]],if [ "$a" \< "$b" ] 在單[]中需要轉義,因為shell也用<和>重定向。

 “>”符號意思是大於,if[[ "$a" > "$b" ]],if [ "$a" \> "$b" ] 在單[]中需要轉義,因為shell也用<和>重定向。

  “=”符號意思是等於,if[[ "$a" = "$b" ]],if [ "$a" = "$b" ] 在單[]中不需要轉義。

測試:

[root@lamp01 ~]# [ 2>1 ] && echo 1 || echo 0
0  ==>這裡的結果邏輯不對,條件應該成立,應該返回1
[root@lamp01 ~]# [ 2\>1 ] && echo 1 || echo 0
1 ==>轉義後是正確的
[root@lamp01 ~]# [ 2 -eq 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 -gt 1 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 -lt 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 -ge 1 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 -le 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 = 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 = 2 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 != 2 ] && echo 1 || echo 0
0

“=” 和 “!=” 在[]中使用不需要轉義,包含“>”和“<”的符號在[]中使用需要轉義,對於數字不轉義的結果未必會報錯,但是結果可能會不對。

[root@lamp01 ~]# [[ 2 > 1 ]] && echo 1 || echo 0
1
[root@lamp01 ~]# [[ 2 > 11 ]] && echo 1 || echo 0 ====>只比較第一位,邏輯結果不對。
1
[root@lamp01 ~]# [[ 2 > 31 ]] && echo 1 || echo 0 ====>只比較第一位,邏輯結果不對。
0

數比較不要加雙引號:系統腳本例子

 

整數比較推薦方法:

[ $numl -eq $num2 ]  ===>註意空格,和比較符號

(($num1>$num2))  ===>無需空格,常規數據比較符號。

--------------------------------------------------------------------------------------------------------

測試結果結論:

1、整數加雙引號也是對的。

2、[]用>號的寫法語法沒錯,邏輯結果不對。

3、[[]]用-eq等的寫法也是對的,[[]]用>寫法也可能不對,只比較第一位,邏輯結果不對。

 

邏輯操作符

在[]和test中使用         在[[]]中使用             說明

     -a                               &&               and與,兩端都為真,則真

     -o                                 ||                or或,兩端有一個真,則真

       !                                  !                  not非,相反則為真

測試:

[root@lamp01 ~]# a1=/etc/rc.local
[root@lamp01 ~]# a2=/etc/services
[root@lamp01 ~]# [ -f "$a1" && -f "$a2" ]&&echo 1||echo 0
-bash: [: missing `]'
0
[root@lamp01 ~]# [ -f "$a1" -a -f "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [[ -f "$a1" && -f "$a2" ]]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -n "$a1" -a -z "$a2" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -n "$a1" -o  "$a1"="$a2" ]&&echo 1||echo 0
1

如果你非要單中括弧加&&或||可以用以下方法:

[root@lamp01 ~]# a1=/etc/rc.local
[root@lamp01 ~]# a2=/etc/services
[root@lamp01 ~]# [ -f "$a1" ]||[ -e "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
1

 !非邏輯符號:

[root@lamp01 ~]# [ -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ ! -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
0
[root@lamp01 ~]# test -f "$a1" -a -e "$a2" &&echo 1||echo 0
1
[root@lamp01 ~]# test !  -f "$a1" -a -e "$a2" &&echo 1||echo 0
0

 

提醒:

1、“-a” 和 “-o” 和“!”邏輯操作符號用於 [] 中使用。

2、“&&”和“||” 和“!”邏輯操作符號用戶 [[]] 中使用。

3、註意括弧兩端,必須要有空格。

4、test用法和 [] 相同。

5、多個[]之間以及多個[[]]之間,或者任意混合中間邏輯操作符都是&&或||。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 上章節我們介紹了有關OU組織單位的日常管理,本章我們將對域用戶的創建進行簡單介紹,常規的操作方法是通過管理控制台圖形化手工創建,具體操作方法如下:1.常規管理控制台 Active Directory 管理中心:2.常規管理控制台 Active Directory用戶和電腦:3.在Active Di... ...
  • 摘要 在我的想象中機器人首先應該能自由的走來走去,然後應該能流利的與主人對話。朝著這個理想,我準備設計一個能自由行走,並且可以與人語音對話的機器人。實現的關鍵是讓機器人能通過感測器感知周圍環境,並通過機器人大腦處理並輸出反饋和執行動作。本章節涉及到的感測器有激光雷達、IMU、輪式里程計、麥克風、音響 ...
  • 摘要 在我的想象中機器人首先應該能自由的走來走去,然後應該能流利的與主人對話。朝著這個理想,我準備設計一個能自由行走,並且可以與人語音對話的機器人。實現的關鍵是讓機器人能通過感測器感知周圍環境,並通過機器人大腦處理並輸出反饋和執行動作。本章節涉及到的感測器有激光雷達、IMU、輪式里程計、麥克風、音響 ...
  • 摘要 在我的想象中機器人首先應該能自由的走來走去,然後應該能流利的與主人對話。朝著這個理想,我準備設計一個能自由行走,並且可以與人語音對話的機器人。實現的關鍵是讓機器人能通過感測器感知周圍環境,並通過機器人大腦處理並輸出反饋和執行動作。本章節涉及到的感測器有激光雷達、IMU、輪式里程計、麥克風、音響 ...
  • 1.安裝必要的包 nfs utils rpcbind (nfs是基於sun公司的rpc通信實現的,所以要裝rpcbind) 這2包,在服務端和客戶端都需要安裝,並啟動服務。 啟動 service rpcbind start service nfs start (順序不能變,nfs依存rpc,所以先啟 ...
  • 小技巧一例,在vs code或notepad++文末批量添加文本欄位信息,便於數據信息的完整,具體操作如下:Visual Studio Code批量添加"@azureyun.com":在VS Code中我們可以通過Ctrl+h快捷鍵調出替換界面,在替換查找界面輸入空行對應的正則表達式$並Alt+R選... ...
  • 昨天 2014年,媳婦坐月子,給媳婦買了mi6和一個小米平板2(16G)。是我們人生擁有的第一個平板,激動不已。 買之前看了小米平板1的口碑不錯,arm構架,NVIDIA的主板好像,圖形處理做得當然沒的說,買新不買舊買了2。 但據說小米意識到1代平板做得有點過於牛逼了,二代沒能超越。 重點是:換了 ...
  • 技術無所謂貴賤,既然曾經做過就總該是要留下點什麼,畢竟做技術這些年給我們留下太多太多的成長經歷,總有人問這些已經很皮毛了為什麼還要寫,其實沒那麼多花哨理由,就是想著做或者不做這一塊總是要對過往做個簡單歸總,習慣已成自然,雖然因為種種原因頻繁隔斷更新,但一有時間就想著寫點什麼,希望N年後還可以幫到更多... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...