shell 程式設計入門

2022-09-18 20:30:16 字數 3244 閱讀 8057

command line,指我們通過輸入命令來操控計算機的一種形式。在某種程度上來說,用cli比用gui更加炫酷、專業以及迅速。

graphical user,指我們通過圖形化如windows的作業系統或終端操作計算機

在電腦科學中,shell又叫殼,shell 是乙個用 c 語言編寫的程式,它是使用者使用 linux 的橋梁。shell 既是一種命令語言,又是一種程式語言。在某種意義上來說,一行shell幹的事情比幾百行c還要多

定義變數時,使用變數名=變數初始值的形式定義變數,如:

para="

jiajun

"para='

jiajun

'para=jiajun

需要注意的是shell是弱型別的語言,所有變數儲存都是字串形式,就算你宣告時a=1,它儲存的時候還是字元的1

使用變數時需要在變數名前加$,變數名可以用大括號括起來,幫助編譯器識別

例如 echo $ab,編譯器就會識別成輸出變數ab的值,而不是a的值後面加個字元b,應該寫成$b才行

在shell中有一些特殊的且常用的變數

變數含義

$0當前指令碼的檔名

$n傳遞給指令碼或函式的引數。n 是乙個數字,表示第幾個引數。例如,第乙個引數是$1,第二個引數是$2。

$#傳遞給指令碼或函式的引數個數。

$*傳遞給指令碼或函式的所有引數

$@傳遞給指令碼或函式的所有引數。被雙引號(" ")包含時,與 $* 稍有不同,下面有寫區別

$?上個命令的退出狀態,或函式的返回值

$$當前shell程序id。對於 shell 指令碼,就是這些指令碼所在的程序id。

$* 和 $@ 都表示傳遞給函式或指令碼的所有引數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有引數。

但是當它們被雙引號(" ")包含時,"$*" 會將所有的引數作為乙個整體,以"$1 $2 … $n"的形式輸出所有引數;"$@" 會將各個引數分開,以"$1" "$2" … "$n" 的形式輸出所有引數。

[ ]和[[ ]]的區別

[ ]為test命令的另一種形式,需要注意的是表示式的左右兩端都要留空格,用數學比較符號來表示字串的比較,而用文字符號來表示數值的比較

[[ ]]為[ ]的加強版,可以使用~=進行模式匹配判斷是否相等,同樣需要左右兩端留空格

以單引號' '包圍變數的值時,單引號裡面是什麼就輸出什麼,即使內容中有變數和命令(命令需要反引起來)也會把它們原樣輸出。這種方式比較適合定義顯示純字串的情況,即不希望解析變數、命令等的場景

以雙引號" "包圍變數的值時,輸出時會先解析裡面的變數和命令,而不是把雙引號中的變數名和命令原樣輸出。這種方式比較適合字串中附帶有變數和命令並且想將其解析後再輸出的變數定義。

後者上面有說是變數替換,更好的識別變數名的邊界

前者是命令替換,是用來重組命令列的,先完成引號裡的命令列,然後將其結果替換出來,再重組成新的命令列。值得一提的是用反引號`包裹也可以實現命令替換的效果

上面有說

$( )是命令替換,而$(( ))則是在裡面的變數可以不用$來替換,且可以直接進行數值運算,無需使用expr語句

a=1 b=2 c=3

echo $((a+b+c))

declare命令用於宣告變數

declare [+/-][rxi][變數名稱=設定值] 或 declare -f

grep命令的常用格式是grep  [選項]  "模式"  [檔案]

常用選項:

-e開啟擴充套件(extend)的正規表示式。

-i忽略大小寫(ignore case)

-v反過來(invert),只列印沒有匹配的,而匹配的反而不列印

-n顯示行號

-w被匹配的文字只能是單詞,而不能是單詞中的某一部分,如文字中有liker,而我搜尋的只是like,就可以使用-w選項來避免匹配liker

-c顯示總共有多少行被匹配到了,而不是顯示被匹配到的內容,注意如果同時使用-cv選項是顯示有多少行沒有被匹配到

-o只顯示被模式匹配到的字串

--color

將匹配到的內容以顏色高亮顯示

-a  n

顯示匹配到的字串所在的行及其後n行,after

-b  n

顯示匹配到的字串所在的行及其前n行,before

-c  n

顯示匹配到的字串所在的行及其前後各n行,context

模式部分可以直接輸入要匹配的字串,也可以使用正規表示式進行匹配

sed命令的格式是sed [選項] [動作]

選項

-n使用安靜(silent)模式

-e直接在命令列模式上進行 sed 的動作編輯;

-f直接將 sed 的動作寫在乙個檔案內, -f filename 則可以執行 filename 內的 sed 動作;

-rsed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)

-i 直接修改讀取的檔案內容,而不是輸出到終端。

動作

a新增行, a 的後面可以是字串,而這些字串會在新的一行出現(目前的下一行)

c取代行, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行

d刪除行,因為是刪除,所以 d 後面通常不接任何引數,直接刪除位址表示的行;

i插入行, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行)

p列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起執行

s替換,可以直接進行替換的工作,通常這個 s 的動作可以搭配正規表示法,例如 1,20s/old/new/g 一般是替換符合條件的字串而不是整行

詳情請進sed樣例教程傳送門

awk

awk是乙個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

太多了以後再研究(doge)

cut

shell程式設計入門

shell指令碼程式不是複雜的程式,它是按行解釋的。指令碼程式總是以 bin sh 開始,它通知shell使用系統上的bourne shell直譯器。其中 符號是注釋。指令碼程式是從上到下執行的,執行指令碼前需要改變該指令碼程式的執行許可權。確保正確建立指令碼例徑,只有 這樣,指令碼程式才能正確執行...

Shell 程式設計入門

首先建立乙個檔案 在終端中輸入如下命令 vi helloworld.sh 然後按i進行命令編寫 下面這句話是必須寫的 bin sh這句話是必須寫的 bin sh a hello world echo a 下面執行的時候先得輸入 將這個許可權改為可執行檔案 chmod x helloworld.sh ...

Shell程式設計入門

目錄 shell概述 shell解析器 shell指令碼 什麼是shell指令碼 編寫shell指令碼 1 指令碼格式 2 第乙個shell指令碼 helloworld 3.指令碼的常用執行方式 第一種 採用bash或sh 指令碼的相對路徑或絕對路徑 不用賦予指令碼 x許可權 第二種 採用輸入指令碼...