Linux命令行與shell腳本編程大全-3-4

第三部分高級shell腳本編程


第17章創建函數

17.1 腳本函數基礎

17.1.1 創建函數

在bash shell 腳本中創建函數的語法有兩種。第一種語法是使用關鍵字function,隨后跟
上分配給該代碼塊的函數名:
function name {
commands
}

17.1.2 使用函數

要在腳本中使用函數,只需像其他shell 命令一樣寫出函數名即可

17.2 函數返回值

17.2.1 默認的退出狀態碼

在默認情況下,函數的退出狀態碼是函數中最后一個命令返回的退出狀態碼。函數執行結束
后,可以使用標準變量$?來確定函數的退出狀態碼。該函數的退出狀態碼是1,因為函數中的最后一個命令執行失敗了。但你無法知道該函數中的其他命令是否執行成功。

17.2.2 使用return命令

使用return 命令以特定的退出狀態碼退出函數。return 命令允許指定一個整數值作為函數的退出狀態碼。當用這種方法從函數中返回值時,一定要小心。為了避免出問題,牢記以下兩個技巧:?函數執行一結束就立刻讀取返回值;退出狀態碼必須介于0~255

$ cat test5
#!/bin/bash
# using the return command in a function
function dbl {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
dbl
echo "The new value is $?"    #用$?變量顯示出該結果
$ 

17.2.3 使用函數輸出

將dbl函數的輸出保存到shell 變量中:result=$(dbl)

$ cat test5b
#!/bin/bash
# using the echo to return a value
function dbl {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=$(dbl)
echo "The new value is $result"
$

17.3 在函數中使用變量

17.3.1 向函數傳遞參數

函數可以使用標準的位置變量來表示在命令行中傳給函數的任何參數。例如,函數名保存在
$0 變量中,函數參數依次保存在$1、$2 等變量中。也可以用特殊變量$#來確定傳給函數的參數
數量。

在腳本中調用函數時,必須將參數和函數名放在同一行

17.3.2 在函數中處理變量
1. 全局變量

全局變量是在shell 腳本內任何地方都有效的變量。

在默認情況下,在腳本中定義的任何變量都是全局變量。在函數外定義的變量可在函數內正
常訪問

2. 局部變量

無須在函數中使用全局變量,任何在函數內部使用的變量都可以被聲明為局部變量。為此,
只需在變量聲明之前加上local 關鍵字即可

$ cat test9
#!/bin/bash
# demonstrating the local keyword
function func1 {
local temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}

17.4 數組變量和函數

將數組變量作為函數參數進行傳遞,則函數只會提取數組變量的第一個元素,,必須先將數組變量拆解成多個數組元素,然后將這些數組元素作為函數參數傳遞。最后在函數內部,將所有的參數重新組合成一個新的數組變量。

17.4.1 向函數傳遞數組
$ cat test10
#!/bin/bash
# array variable to function test
function testit {
local newarray   # 創建數組
newarray=(`echo "$@"`) #所有的參數重新組合成一個新的數組變量
echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}
$
$ ./test10
The original array is 1 2 3 4 5
The new array value is: 1 2 3 4 5
$
17.4.2 從函數返回數組

函數先用echo 語句按正確順序輸出數組的各個元素,然后腳本再將數組元素重組成一個新的數組變量

$ cat test12
#!/bin/bash
# returning an array value
function arraydblr {
local origarray
local newarray
local elements
local i
origarray=($(echo "$@"))
newarray=($(echo "$@"))
elements=$[ $# - 1 ]
for (( i = 0; i <= $elements; i++ ))
{
newarray[$i]=$[ ${origarray[$i]} * 2 ]
}
echo ${newarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}" 
arg1=$(echo ${myarray[*]})   # echo 語句重組成一個新的數組變量
result=($(arraydblr $arg1)) # 通過$arg1 變量將數組元素作為參數傳給arraydblr 函數。
echo "The new array is: ${result[*]}" 
$
$ ./test12
The original array is: 1 2 3 4 5
The new array is: 2 4 6 8 10

17.5 函數遞歸

局部函數變量的一個特性是自成體系(self-containment)。除了獲取函數參數,自成體系的
函數不需要使用任何外部資源。這個特性使得函數可以遞歸地調用,也就是說函數可以調用自己來得到結果。

17.6 創建庫

bash shell 允許創建函數庫文件,然后在多個腳本中引用此庫文件。

在多個腳本中使用同一段代碼

第一步是創建一個包含腳本中所需函數的公用庫文件,例如:庫文件myfuncs

第二步是在需要用到這些函數的腳本文件中包含myfuncs 庫文件,用source 命令在腳本中運行庫文

$ cat test14
#!/bin/bash
# using functions defined in a library file
. ./myfuncs   #  . ./  使用這個來調用
value1=10
value2=5
result1=$(addem $value1 $value2)
result2=$(multem $value1 $value2)
result3=$(divem $value1 $value2)
echo "The result of adding them is: $result1"
echo "The result of multiplying them is: $result2"
echo "The result of dividing them is: $result3"
$
$ ./test14
The result of adding them is: 15
The result of multiplying them is: 50
The result of dividing them is: 2
$

source 命令有個別名,稱作點號操作符。

17.7 在命令行中使用函數

17.7.1 在命令行中創建函數
1.?采用單行方式來定義函數
$ function divem { echo $[ $1 / $2 ]; }
$ divem 100 5
?2.采用多行方式來定義函數

使用這種方法,無須在每條命令的末尾放置分號,只需按下回車鍵即可

$ function multem {
> echo $[ $1 * $2 ]
> }
$ multem 2 5
10
17.7.2 在.bashrc文件中定義函數
1. 直接定義函數


可以直接在用戶主目錄的.bashrc 文件中定義函數,只需將函數放在文件末尾即可

2. 源引函數文件


只要是在shell 腳本中,就可以用source 命令(或者其別名,即點號操作符)將庫文件中
的函數添加到.bashrc 腳本中

$ cat .bashrc
# .bashrc
# Source global definitions
if [ -r /etc/bashrc ]; then
. /etc/bashrc
fi
. /home/rich/libraries/myfuncs  # 將庫文件中的函數添加到.bashrc 腳本
$


第18章 圖形化桌面環境中的腳本編程 #


第19章 初識sed和gawk

19.1文本處理

19.1.1 sed編輯器

sed 編輯器被稱作流編輯器(stream editor)

sed 命令的格式如下:?
sed options script file

1. 在命令行中定義編輯器命令

在默認情況下,sed 編輯器會將指定的命令應用于STDIN 輸入流中。因此,可以直接將數據
通過管道傳入sed 編輯器進行處理。

$ echo "This is a test" | sed 's/test/big test/'
This is a big test
$#接將數據通過管道傳入sed 編輯器進行處理, 替換(s)命令,將big test 替換了test
2. 在命令行中使用多個編輯器命令

如果要在sed 命令行中執行多個命令,可以使用-e 選項

$ sed -e 's/brown/red/; s/dog/cat/' data1.txt
The quick red fox jumps over the lazy cat.
The quick red fox jumps over the lazy cat.
The quick red fox jumps over the lazy cat.
The quick red fox jumps over the lazy cat.
$
3. 從文件中讀取編輯器命令
?

有大量要執行的sed 命令,那么將其放進單獨的文件通常會更方便一些。可以在sed
命令中用-f 選項來指定文件:

$ cat script1.sed
s/brown/green/
s/fox/toad/
s/dog/cat/
$
$ sed -f script1.sed data1.txt
The quick green toad jumps over the lazy cat.
The quick green toad jumps over the lazy cat.
The quick green toad jumps over the lazy cat.
The quick green toad jumps over the lazy cat.
$
19.1.2 gawk編輯器

雖然sed 編輯器非常方便,可以即時修改文本文件

19.2 sed編輯器基礎命令 #

19.2.1 更多的替換選項 #
19.2.2 使用地址 #
19.2.3 刪除行 #
19.2.4 插入和附加文本? #
19.2.5 修改行 #
19.2.6 轉換命令 #
19.2.7 再探打印 #
19.2.8 使用sed處理文件 #


第20章 正則表達式

正則表達式是一種可供Linux 工具過濾文本的自定義模板


第21章 sed進階 #


第22章 gawk進階 #?


第23章 使用其他shell

  • dash shell
  • zsh shell

?第四部分 創建和管理實用的腳本

第24章 編寫簡單的腳本實用工具
第25章 井井有條

第24章 編寫簡單的腳本實用工具


24.1 備份

定時進行備份(也稱作歸檔)

24.1.1 日常備份 #
24.1.2 創建按小時歸檔的腳本 #


24.2 刪除賬戶

管理本地用戶賬戶絕不僅僅是添加、修改和刪除,還需考慮安全問題、保留工作的需求,以
及精確刪除賬戶。

刪除本地賬戶屬于更復雜的賬戶管理任務,至少需要4 個步驟。
(1) 獲取正確的待刪除用戶賬戶名。
(2)“殺死”系統中正在運行的屬于該賬戶的進程。
(3) 確認系統中屬于該賬戶的所有文件。
(4) 刪除該用戶賬戶。


24.3 系統監控


24.3.1 獲得默認的shell審計功能

使用cut 命令獲取/etc/passwd 文件中所有賬戶的默認shell。

$ cut -d: -f7 /etc/passwd

24.3.2 權限審計功能

SUID(set user ID)和SGID(set group ID)是兩種很方便的權限設置

找出具有這兩種權限的文件和目錄,需要使用find 命令

$ sudo find / -perm /6000 2>/dev/null


第25章 井井有條

25.1 理解版本控制


25.1.1 工作目錄

工作目錄是所有腳本的創建、修改和審查之地。它通常是腳本編寫者的主目錄中的某個子目錄,類似于/home/christine/scripts。最好為每個項目都創建一個新的子目錄,因為Git 會在其中放
置文件,以便進行跟蹤。

25.1.2 暫存區

暫存區也稱為索引。該區域和工作目錄位于同一系統。bash 腳本通過Git 命令(git add)
在暫存區內注冊。通過git init 命令,暫存區在工作目錄中設置了一個名為.git 的隱藏子目錄。

25.1.3 本地倉庫

本地倉庫包括每個腳本文件的歷史記錄。它也會用到工作目錄的.git 子目錄。腳本文件的各
個版本(稱為項目樹)和提交信息之間的關系通過Git 命令(git commit),以對象的方式存儲
在.git/objects/目錄中。
項目樹和提交數據合起來稱為快照。每次提交數據都會創建一個新快照。不過,舊快照并不
會被刪除,依然可以查看。如果需要,還可以返回到之前的快照,這是Git 另一個不錯的特性。

25.1.4 遠程倉庫

在Git 配置中,遠程倉庫通常位于云端,提供代碼托管服務。著名的遠程倉庫有GitHub、GitLab、BitBucket 和Launchpad。不過到目前為止,GitHub 最受歡迎

25.1.5 分支

Git 還提供了一個名為分支的特性,該特性可以在各種腳本項目中發揮作用。分支是本地倉
庫中屬于特定項目的一個區域。

25.1.6 克隆

Git 的另一個特性是復制項目。這個過程稱為克隆。

注意 在Git 中,克隆(cloning)分叉(forking)是兩種緊密相關的操作。使用git clone
命令將文件從遠程倉庫下載到本地系統,這一過程是克隆。將文件從一個遠程倉庫復制
到另一個遠程倉庫,這一過程是分叉。


25.1.7 使用Git作為VCS

好處

性能:Git只操作本地文件, 這提高了其部署速度。同遠程倉庫之間收發文件屬于例外
情況。
歷史文件:從文件被注冊那一刻起, Git就開始使用索引來記錄文件的內容。當對本地存
儲庫的提交完成時, Git會及時創建并存儲對該快照的引用。
準確性:Git使用校驗和來保護文件完整性。
去中心化:腳本編寫者可以在同一個項目中工作,但不必位于同一網絡或系統。


25.2 設置Git環境

安裝好git 軟件包之后,為新的腳本項目設置Git 環境涉及以下4 個基本步驟。
(1) 創建工作目錄:?

$ mkdir MWGuard$ cd MWGuard/


(2) 初始化.git/子目錄

$ git init
$ git remote add origin https://github.com/C-Bresnahan/MWGuard.git
$
$ git remote -v
origin https://github.com/C-Bresnahan/MWGuard.git (fetch)
origin https://github.com/C-Bresnahan/MWGuard.git (push)
$


(3) 設置本地倉庫選項

#,則需將姓名和email 地址添加到Git 的全局倉庫配置文件中
$ git config --global user.name "Christine Bresnahan"
$ git config --global user.email "cbresn1723@gmail.com"


(4) 確定遠程倉庫位置

建立好項目的遠程倉庫之后,需要把倉庫地址記下來。隨后向遠程倉庫發送項目文件時,要
用到這個地址。

可以使用git remote add origin URL 命令來添加地址,其中URL 就是遠程倉庫地址:

$ git remote add origin https://github.com/C-Bresnahan/MWGuard.git
$
$ git remote -v
origin https://github.com/C-Bresnahan/MWGuard.git (fetch)
origin https://github.com/C-Bresnahan/MWGuard.git (push)
$


25.3 使用Git提交文件

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

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

相關文章

代碼隨想錄算法訓練營Day46 | 139.單詞拆分、多重背包(卡碼網56.攜帶礦石資源)

139.單詞拆分 可以理解為一道 完全背包 排列 的題&#xff0c;dp數組定義和遞推公式部分腦子需要轉個彎 1、DP數組定義&#xff1a;一維滾動數組vector<bool>。dp[j]表示字符串s的[0, j]子串是否能夠匹配。 2、DP數組初始化&#xff1a;dp[0]初始化為true&#xff0c;其…

Multi-Head Attention詳解

文中大部分內容以及圖片來自&#xff1a;https://medium.com/hunter-j-phillips/multi-head-attention-7924371d477a 當使用 multi-head attention 時&#xff0c;通常d_key d_value &#xff08;d_model / n_heads&#xff09;&#xff0c;其中n_heads是頭的數量。研究人員稱…

01-Vue2 介紹與指令的使用

1. Vue核心 1.1. Vue簡介 1.1.1. 官網 中文官網Vue.js - 漸進式 JavaScript 框架 | Vue.js (vuejs.org)https://cn.vuejs.org/ 英文官網Vue.js - The Progressive JavaScript Framework | Vue.js (vuejs.org)https://vuejs.org/ 1.1.2. 介紹與描述 VUE是構建于用戶界面的漸進…

靶機滲透之sar

Name: Sar: 1Date release: 15 Feb 2020Author: LoveSeries: Sar Download: https://drive.google.com/open?id1AFAmM21AwiAEiVFUA0cSr_GeAYaxd3lQ 對于vulnhub中的靶機&#xff0c;我們都需先下載鏡像&#xff0c;然后導入VM&#xff0c;并將網絡連接改為NAT模式。首先我們…

UDP數據報套接字編程入門

目錄 1.TCP和UDP的特點及區別 1.1TCP的特點 1.2UDP的特點 1.3區別 2.UDP Socket的api的介紹 2.1DatagramSocket API 2.2DatagramPacket API 3.回顯客戶端與服務器 3.1回顯服務器 3.1.1UdpEchoServer類的創建 3.1.2服務器的運行方法start() 3.1.3main部分 3.1.4.完整…

C# CAD PaletteSet.Style各種外觀和行為樣式

ps.Style 是 Autodesk.AutoCAD.Windows.PaletteSet 類的一個屬性&#xff0c;用于定義調色板集&#xff08;PaletteSet&#xff09;的各種外觀和行為樣式。它可以是 PaletteSetStyles 枚舉類型的組合值 PaletteSetStyles 枚舉中包含以下一些選項&#xff1a; NameEditable&am…

統計子矩陣

一、題目描述 P8783 [藍橋杯 2022 省 B] 統計子矩陣 二、算法簡析 2.1 二維前綴和 我們知道&#xff0c;只要確定了矩陣的左上頂點和右下頂點&#xff0c;一個矩陣就被固定了。因此&#xff0c;我們可以遍歷這兩個頂點&#xff0c;達到遍歷所有子矩陣的目的&#xff0c;復雜…

AutoSAR(基礎入門篇)12.5-Dem

目錄 一、Dem簡介 二、Dem消抖 1、計數模式 1. 普通增減計數 2. 反向歸零增減模式

在微服務整合dubbo,以為微服務版的若依為例

在微服務整合dubbo&#xff0c;以為微服務版的若依為例 一、環境二、整合過程1、父模塊依賴2、生產者3、消費者 三、修改若依的服務調用方式為dubbo1、改造系統模塊2、改造認證授權中心 四、整合過程遇到的問題1、出現循環引用2、出現依賴沖突3、啟動出現端口號被占用4、出現某…

UVa11726 Crime Scene

題目鏈接 UVa11726 - Crime Scene 題意 給定n&#xff08;n≤100&#xff09;個物體&#xff0c;每個物體都是一個圓或者k&#xff08;k≤10&#xff09;邊形&#xff0c;用長度盡量小的繩子把它們包圍起來。 分析 孟加拉國Manzurur Rahman Khan (Sidky)大神出的難題&#xff…

MySQL 核心模塊揭秘 | 07 期 | 二階段提交 (1) prepare 階段

二階段提交的 prepare 階段&#xff0c;binlog 和 InnoDB 各自會有哪些動作&#xff1f; 本文基于 MySQL 8.0.32 源碼&#xff0c;存儲引擎為 InnoDB。 1. 二階段提交 二階段提交&#xff0c;顧名思義&#xff0c;包含兩個階段&#xff0c;它們是&#xff1a; prepare 階段。…

springboot-基礎-eclipse配置+helloword示例

備份筆記。所有代碼都是2019年測試通過的&#xff0c;如有問題請自行搜索解決&#xff01; 下一篇&#xff1a;springboot-基礎-添加model和controller的簡單例子常用注解含義 目錄 配置helloword示例新建項目創建文件 配置 spring boot官方有定制版eclipse&#xff0c;也就是…

BUUCTF AWD-Test1

打開靶場是這個有些簡陋的界面。 隨便點點&#xff0c;找到這個東西。 看到ThinkPHP&#xff0c;思路瞬間清晰&#xff0c;老熟人了。這個就是ThinkPHP漏洞。根據版本我們去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

SHELL 腳本: 導出NEO4j DUMP并上傳SFTP

前提 開通sftp賬號 安裝expect 示例 NEO4J_HOME/path/to/neo4j # neo4j 安裝目錄 DUMP_PATH/data/dump # DUMP本地保存目錄 DUMP_FILEneo4j_$(date %F).dump #導出文件名稱 UPLOAD_DIR/path/to/stfp/dump/ #上傳目錄 $NEO4J_HOME/bin/neo4j-admin dump --databaseneo4j --t…

Vue-5

Vue 3 的優勢 更容易維護&#xff08;組合式API&#xff09;更快的速度更小的體積更優的數據響應 創建 Vue 3 項目 前提環境條件&#xff1a;已安裝 16.0 或更高版本的 Node.js node -v創建一個 Vue 應用&#xff08;下面的指令將會安裝并執行 create-vue &#xff09; np…

服務端向客戶端推送數據的實現方案

在日常的開發中&#xff0c;我們經常能碰見服務端需要主動推送給客戶端數據的業務場景&#xff0c;比如數據大屏的實時數據&#xff0c;比如消息中心的未讀消息&#xff0c;比如聊天功能等等。 本文主要介紹SSE的使用場景和如何使用SSE。 服務端向客戶端推送數據的實現方案有哪…

MySQL 自增列解析(Auto_increment)

MySQL數據庫為列提供了一種自增屬性&#xff0c;當列被定義為自增時。Insert語句對該列即使不提供值&#xff0c;MySQL也會自動為該列生成遞增的唯一標識&#xff0c;因此這個特性廣泛用于主鍵的自動生成。 一、自增列的用法 自增列具有自動生成序列值&#xff0c;整型&#…

職責鏈模式(Chain of Responsibility Pattern)

定義 職責鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為設計模式&#xff0c;它允許對象接收請求并將其沿著處理者鏈傳遞&#xff0c;直到有一個處理者處理它為止。職責鏈模式通過將請求的處理邏輯分布 在職責鏈模式中&#xff0c;通常包含以下幾…

MYSQL04高級_邏輯架構剖析、查詢緩存、解析器、優化器、執行器、存儲引擎

文章目錄 ①. 邏輯架構剖析②. 服務層 - 查詢緩存③. 服務層 - 解析器④. 服務層 - 優化器⑤. 服務層 - 執行器⑥. MySQL8執行原理 ①. 邏輯架構剖析 ①. 服務器處理客戶端請求 ②. 連接層 系統(客戶端)訪問MySQL服務器前,做的第一件事就是建立TCP連接經過三次握手建立連接成…

Linux使用C語言實現通過互斥鎖限制對共享資源的訪問

互斥鎖限制共享資源的訪問 主線程中有兩個線程&#xff0c;分別輸出信息。 #include <stdio.h> #include <pthread.h> #include <unistd.h>int g_data0;void* fun1(void *arg) {printf("t1&#xff1a;%ld thread is create\n", (unsigned long)…