linux shell

文章目錄

  • 預設參數
  • 腳本自動開終端
  • if語句
    • 語法
    • 常用判斷命令
      • 文件/目錄判斷:
      • 字符串判斷
      • 數值判斷
      • 邏輯判斷
    • if高級特性:

預設參數

  • $$
    Shell本身的PID(ProcessID)
  • $!
    Shell最后運行的后臺Process的PID
  • $?
    最后運行的命令的結束代碼(返回值)
  • $-
    使用Set命令設定的Flag一覽
  • $*
    所有參數列表。如"$*"用「"」括起來的情況、以"$1 $2 … $n"的形式輸出所有參數。
  • $@
    所有參數列表。如"$@"用「"」括起來的情況、以"$1" "$2" … "$n" 的形式輸出所有參數。
  • $#
    添加到Shell的參數個數
  • $0
    Shell本身的文件名
  • $1~$n
    添加到Shell的各參數值。$1是第1參數、$2是第2參數…。
    腳本舉例

我們先寫一個簡單的腳本,執行以后再解釋各個變量的意義

$ touch variable
$ vi variable
#腳本內容如下:
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
#保存退出
#賦予腳本執行權限
chmod +x variable
#執行腳本
$ ./variable aa bb
# 輸出結果
number:2
scname:./variable
first: aa
second:bb
argume:aa bb

結果分析:

通過顯示結果可以看到:

  • $# 是傳給腳本的參數個數
  • $0 是腳本本身的名字
  • $1是傳遞給該shell腳本的第一個參數
  • $2是傳遞給該shell腳本的第二個參數
  • $@ 是傳給腳本的所有參數的列表

腳本自動開終端

寫bash腳本自動開程序:

# 新開一個終端
gnome-terminal -- bash -c "命令;命令;"

if語句

語法

基本語法:

if [ command ]; then符合該條件執行的語句
fi

擴展語法:

if [ command ];then符合該條件執行的語句
elif [ command ];then符合該條件執行的語句
else符合該條件執行的語句
fi
  • bash shell會按順序執行if語句,如果command執行后且它的返回狀態是0,則會執行符合該條件執行的語句,否則后面的命令不執行,跳到下一條命令。
  • 當有多個嵌套時,只有第一個返回0退出狀態的命令會導致符合該條件執行的語句部分被執行,如果所有的語句的執行狀態都不為0,則執行else中語句。
  • 返回狀態:最后一個命令的退出狀態,或者當沒有條件是真的話為0。
  1. [ ]表示條件測試。注意兩邊的空格很重要。要注意在[后面和]前面都必須要有空格
  2. 在shell中,then和fi是分開的語句。如果要在同一行里面輸入,則需要用分號將他們隔開。
  3. 注意if判斷中對于變量的處理,需要加引號,以免一些不必要的錯誤。沒有加雙引號會在一些含空格等的字符串變量判斷的時候產生錯誤。比如[ -n "$var" ]如果var為空會出錯
  4. 判斷是不支持浮點值的
  5. 如果在非(())中單獨使用>或者<號,系統會認為是輸出或者輸入重定向,雖然結果顯示正確,但是其實是錯誤的,因此要對這些符號進行轉意
  6. 在默認中,運行if語句中的命令所產生的錯誤信息仍然出現在腳本的輸出結果中
  7. 使用-z或者-n來檢查長度的時候,沒有定義的變量也為0
  8. 空變量和沒有初始化的變量可能會對shell腳本測試產生災難性的影響,因此在不確定變量的內容的時候,在測試號前使用-n或者-z測試一下
  9. $? 變量包含了之前執行命令的退出狀態(最近完成的前臺進程)(可以用于檢測退出狀態)

常用判斷命令

文件/目錄判斷:

[ -a FILE ] 如果 FILE 存在則為真。
[ -b FILE ] 如果 FILE 存在且是一個塊文件則返回為真。
[ -c FILE ] 如果 FILE 存在且是一個字符文件則返回為真。
[ -d FILE ] 如果 FILE 存在且是一個目錄則返回為真。
[ -e FILE ] 如果 指定的文件或目錄存在時返回為真。
[ -f FILE ] 如果 FILE 存在且是一個普通文件則返回為真。
[ -g FILE ] 如果 FILE 存在且設置了SGID則返回為真。
[ -h FILE ] 如果 FILE 存在且是一個符號符號鏈接文件則返回為真。(該選項在一些老系統上無效)
[ -k FILE ] 如果 FILE 存在且已經設置了冒險位則返回為真。
[ -p FILE ] 如果 FILE 存并且是命令管道時返回為真。
[ -r FILE ] 如果 FILE 存在且是可讀的則返回為真。
[ -s FILE ] 如果 FILE 存在且大小非0時為真則返回為真。
[ -u FILE ] 如果 FILE 存在且設置了SUID位時返回為真。
[ -w FILE ] 如果 FILE 存在且是可寫的則返回為真。(一個目錄為了它的內容被訪問必然是可執行的)
[ -x FILE ] 如果 FILE 存在且是可執行的則返回為真。
[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則返回為真。
[ -G FILE ] 如果 FILE 存在且默認組為當前組則返回為真。(只檢查系統默認組)
[ -L FILE ] 如果 FILE 存在且是一個符號連接則返回為真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則返回為真。
[ -S FILE ] 如果 FILE 存在且是一個套接字則返回為真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 新, 或者 FILE1 存在但是 FILE2 不存在則返回為真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在但是 FILE1 不存在則返回為真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的設備和節點號則返回為真。

字符串判斷

[ -z STRING ] 如果STRING的長度為零則返回為真,即空是真
[ -n STRING ] 如果STRING的長度非零則返回為真,即非空是真
[ STRING1 ]  如果字符串不為空則返回為真,與-n類似
[ STRING1 == STRING2 ] 如果兩個字符串相同則返回為真
[ STRING1 != STRING2 ] 如果字符串不相同則返回為真
[ STRING1 < STRING2 ] 如果 “STRING1”字典排序在“STRING2”前面則返回為真。
[ STRING1 > STRING2 ] 如果 “STRING1”字典排序在“STRING2”后面則返回為真。

數值判斷

[ INT1 -eq INT2 ] INT1和INT2兩數相等返回為真 ,=
[ INT1 -ne INT2 ] INT1和INT2兩數不等返回為真 ,<>
[ INT1 -gt INT2 ] INT1大于INT2返回為真 ,>
[ INT1 -ge INT2 ] INT1大于等于INT2返回為真,>=
[ INT1 -lt INT2 ] INT1小于INT2返回為真 ,<
[ INT1 -le INT2 ] INT1小于等于INT2返回為真,<=

邏輯判斷

[ ! EXPR ] 邏輯非,如果 EXPR 是false則返回為真。
[ EXPR1 -a EXPR2 ] 邏輯與,如果 EXPR1 and EXPR2 全真則返回為真。
[ EXPR1 -o EXPR2 ] 邏輯或,如果 EXPR1 或者 EXPR2 為真則返回為真。
[ ] || [ ] 用OR來合并兩個條件
[ ] && [ ] 用AND來合并兩個條件

if高級特性:

雙圓括號(( )):表示數學表達式
在判斷命令中只允許在比較中進行簡單的算術操作,而雙圓括號提供更多的數學符號,而且在雙圓括號里面的>,<號不需要轉意。

雙方括號[[ ]]:表示高級字符串處理函數
雙方括號中判斷命令使用標準的字符串比較,還可以使用匹配模式,從而定義與字符串相匹配的正則表達式。

在shell中,[ $a != 1 || $b = 2 ]是不允許的,要用[ $a != 1 ] || [ $b = 2 ],而雙括號就可以解決這個問題的,[[ $a != 1 || $b = 2 ]]。又比如這個[ "$a" -lt "$b" ],也可以改成雙括號的形式(("$a" < "$b"))

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

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

相關文章

MySQL InnoDB Replication部署方案與實踐

1. 概述 MySQL Innodb ReplicaSet 是 MySQL 團隊在 2020 年推出的一款產品&#xff0c;用來幫助用戶快速部署和管理主從復制&#xff0c;在數據庫層仍然使用的是主從復制技術。 ReplicaSet 主要包含三個組件&#xff1a;MySQL Router、MySQL Server 以及 MySQL Shell 高級客戶…

eventBus父組件$emit一次子組件多次收到¥

eventBus父組件$emit一次子組件多次收到$on 參考&#xff08;EventBus踩坑1-CSDN博客&#xff09; 父組件emit出了事件&#xff0c;這個過程需要一定時間&#xff0c;這段時間過長&#xff0c;子組件還未接收到父組件的emit&#xff0c;父組件認為子組件沒有收到&#xff0c;…

12 位多通道國產芯片ACM32F403/F433 系列,支持 MPU 存儲保護功能,應用于工業控制,智能家居等產品中

ACM32F403/F433 芯片的內核基于 ARMv8-M 架構&#xff0c;支持 Cortex-M33 和 Cortex-M4F 指令集。芯片內核 支持一整套DSP指令用于數字信號處理&#xff0c;支持單精度FPU處理浮點數據&#xff0c;同時還支持Memory Protection Unit &#xff08;MPU&#xff09;用于提升應用的…

Java - Mybatis借助PageHelper實現分頁,集成SpringBoot

未使用SpringBoot 第?步&#xff1a;引?依賴 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.1</version> </dependency> 第?步&#xff1a;在mybatis-config.xml…

PyTorch張量:內存布局

你可能對 torch 上的某些函數感到困惑&#xff0c;它們執行相同的操作但名稱不同。 例如&#xff1a; reshape()、view()、permute()、transpose() 等。 這些函數的做法真的不同嗎&#xff1f; 不&#xff01; 但為了理解它&#xff0c;我們首先需要了解一下張量在 pytorch 中…

1 CPU實現的基本框圖

匯編語言 && 指令格式 CPU設計的框架&#xff1a;三級流水線 ROM存放指令和數據&#xff0c;大端模式&小端模式&#xff0c;地址對齊 取指 譯碼&#xff1a; 執行&#xff1a; 匯編語言 & 指令格式 流水線實現工作機制 模塊功能劃分&接口信號 參考…

Linux中用rpm管理軟件

本章主要介紹使用rpm對軟件包進行管理 使用rpm查詢軟件的信息使用rpm安裝及卸載軟件使用rpm對軟件進行更新使用rpm對軟件進行驗證 rpm 全稱是redhat package manager&#xff0c;后來改成rpm package manager&#xff0c;這是根據源 碼包編譯出來的包。先從光盤中拷貝一個包&…

strict-origin-when-cross-origin

嚴格限制同源策略 &#xff08;1&#xff09;允許服務器的同源IP地址訪問 &#xff08;2&#xff09;允許Referer --- 后端服務器要配置

linux sed命令刪除一行/多行_sed刪除第一行/linux刪除文件某一行

sed系列文章 linux常用命令(9)&#xff1a;sed命令(編輯/替換/刪除文本)linux sed命令刪除一行/多行_sed刪除第一行/linux刪除文件某一行 文章目錄 sed系列文章一、sed刪除某一行內容/刪除最后一行二、sed刪除多行三、擴展3.1、-i命令 本文主要講解如何刪除txt文件中的某一行內…

vite+ts——user.ts——ts接口定義+axios請求的寫法

import axios from axios; import qs from query-string; import {UserState} from /store/modules/user/types;export interface LoginData{username:string;password:string;grant_type?:string;scope?:string;client_id?:string;client_secret?:string;response_type?:…

企業使用APP自動化測試工具的重要因素

隨著移動應用市場的蓬勃發展&#xff0c;企業對高質量、高效率的軟件交付提出了更高的要求。在這個背景下&#xff0c;APP自動化測試工具成為了企業不可或缺的一部分。以下是企業采用APP自動化測試工具的關鍵因素&#xff1a; 1. 快速且可重復的測試執行 自動化測試工具能夠快速…

Docker入門概念

文章目錄 容器&#xff08;container&#xff1a;容器/集裝箱&#xff09;技術虛擬機解決了哪些部署問題docker解決了哪些部署問題docker是如何做到容器間運行時環境隔離的docker基本概念docker基本使用 容器&#xff08;container&#xff1a;容器/集裝箱&#xff09;技術 容…

奧威亞視頻云平臺VideoCover.aspx 接口任意文件上傳漏洞復現 [附POC]

文章目錄 奧威亞視頻云平臺VideoCover.aspx 接口任意文件上傳漏洞復現 [附POC]0x01 前言0x02 漏洞描述0x03 影響版本0x04 漏洞環境0x05 漏洞復現1.訪問漏洞環境2.構造POC3.復現0x06 修復建議奧威亞視頻云平臺VideoCover.aspx 接口任意文件上傳漏洞復現 [附POC] 0x01 前言 免責…

做數據分析為何要學統計學(5)——什么問題適合使用卡方檢驗?

卡方檢驗作為一種非常著名的非參數檢驗方法&#xff08;不受總體分布因素的限制&#xff09;&#xff0c;在工程試驗、臨床試驗、社會調查等領域被廣泛應用。但是也正是因為使用的便捷性&#xff0c;造成時常被誤用。本文參閱相關的文獻&#xff0c;對卡方檢驗的適用性進行粗淺…

原來使用代碼也可以畫時序圖,用這個Mermaid就行,真香

本文首發于我的個人掘金博客&#xff0c;看到很多人都比較喜歡這篇文章&#xff0c;分享給大家。 個人博客主頁&#xff1a;https://www.aijavapro.cn 個人掘金主頁&#xff1a;juejin.cn/user/2359988032644541/posts 個人知識星球: 覺醒的新世界程序員 一、背景 在軟件開發和…

spring數據校驗

我是南城余&#xff01;阿里云開發者平臺專家博士證書獲得者&#xff01; 歡迎關注我的博客&#xff01;一同成長&#xff01; 一名從事運維開發的worker&#xff0c;記錄分享學習。 專注于AI&#xff0c;運維開發&#xff0c;windows Linux 系統領域的分享&#xff01; 本…

數據庫(一)| 數據庫概述、基本概念、關系型數據庫特點、超鍵候選碼等

文章目錄 1 數據庫的一些基礎概念1.1 數據庫和數據庫管理系統1.2 關系模式和關系實例1.3 數據庫模式和數據庫實例 2 數據庫組織形式2.1 數據采用文件的缺點2.2 使用數據庫管理系統的 優點 3 關系型數據庫特點4 三個層次的數據抽象Data Abstraction5 超鍵、候選碼、主碼、外碼 1…

php之jwt使用

PHP JWT&#xff08;JSON Web Token&#xff09;是一種用于身份驗證和授權的開放標準。JWT是一個包含有關用戶或實體身份信息的安全令牌&#xff0c;它由三部分組成&#xff1a;頭部&#xff08;Header&#xff09;、載荷&#xff08;Payload&#xff09;和簽名&#xff08;Sig…

計算機網絡編程

網絡編程 Java 是第一大編程語言和開發平臺。它有助于企業降低成本、縮短開發周期、推動創新以及改善應用服務。如今全球有數百萬開發人員運行著超過 51 億個 Java 虛擬機&#xff0c; Java 仍是企業和開發人員的首選開發平臺。 課程內容的介紹 1. 計算機網絡基礎 2. So…

數據結構基礎介紹

一.起源及重要性 1968 年&#xff0c;美國的高德納 Donakl E . Kn uth 教授在其所寫的《 計算機程序藝術》第一卷《基本算法 》 中&#xff0c;較系統地闡述了數據的邏輯結構和存儲結構及其操作&#xff0c; 開創了數據結構的課程體系 &#xff0c;數據結構作為一門獨立的…