《shell指令碼學習指南》學習筆記之入門 一

2021-08-02 09:50:33 字數 3625 閱讀 3589

這個部落格是我結合書上所看以及**大神總結所得,寫到自己部落格上,只是為了加深的印象,更加方便的學習。

shell指令碼能夠輕易處理檔案與目錄之類的物件,而且是各unix系統之間經過posix標準化的通用的功能,因此shell指令碼只要「用心寫」一次,即可應用到很多系統上,因此之所以要使用shell指令碼是基於:

簡單性:shell是乙個高階語言,通過它,你可以簡潔地表達發雜的操作;

可移植性:使用posix所定義的功能,可以做到指令碼無須修改就可以在不同的系統上執行;

開發容易:可以在短時間內完成乙個功能強大又好用的指令碼;

cat > testshell                    建立檔案,使用cat複製終端輸入

who | wc -l 程式內容

^d ctrl-d表示end-of

-file

$ chmod +x testshell 讓檔案擁有執行許可權

$ ./testshell 執行測試

//who 現在有誰登陸

//wc 字數計算程式 可以算出line ,字數 word 與 字元數 (character)。wc -l 計算出行數

當shell執行乙個程式時,會要求unix核心啟動乙個新的程序(process),以便在該程序裡執行所制定的程式。當shell要求核心執行它時,核心無法做這件事,因為它不是編譯型程式,於是回應「not executable format file」(不是可執行的格式檔案)錯誤資訊。shell收到此錯誤資訊時,就會認為「既然不是編譯型程式,那就一定是shell指令碼」,於是會啟動乙個新的/bin/sh(標準shell)副本來執行該程式。

如上述當系統只有乙個shell(/bin/sh)時還行,但現行的unix系統都會擁有好幾個shell,那麼我們就需要一種方式來告訴unix核心該啟用那個shell來執行,這種方式就是:在第一行的開頭除使用#!這兩個字元,其後跟shell的具體路徑。如:

#! /bin/sh

who | wc -l

//#!後的shell還可以被傳引數。

1.內建命令就是由shell本身所執行的命令。

有些命令是由於其必要性才內建的,例如cd用來改變目錄、 read會將來自使用者(或檔案)的輸入資料傳給shell變數;

另一種內建命令存在則是為了效率,其中最典型的就是test命令,編寫指令碼時經常用到它;

還有i/o命令,如echo和printf;

2.shell函式是功能健全的一些程式**,以shell語言寫成,他們可以像命令那樣引用。

3.外部命令就是由shell的副本(新的程序)所執行的命令,基本過程如下:

建立乙個新的程序,此程序即為shell的乙個副本;

在新的程序裡,在path變數內所列出的目錄中,尋找特定的命令。/bin:/usr/bin:/usr/x11r6/bin:/usr/local/bin為path變數典型的預設值。當命令名稱含有斜槓(/)符號時,將略過路徑查詢步驟;

在新的程序裡,以所找到的新程式取代執行中的shell程式並執行;

程式完成後,最初的shell會接著從終端讀取下一條命令,或執行指令碼裡的下一條命令,如下圖

shell變數名稱的開頭是乙個字母或下劃線符號,後面可以接字母、數字或下劃線符號。變數賦值:

變數名=變數值

=號左右沒有空格,當使用變數時,只需要在變數名前加上」$「符號.如:

#! /bin/sh

website=oseye.net

echo

$website

#單行可以進行多次賦值

name=kevin age=22 ***=f

#值中包含空格時使用引號

address="guandong china"

#變數賦給別的變數

address2=$address

#當幾個變數組合賦給變數可以使用雙引號

當我這樣寫是路徑echo $website 沒有輸出

原因是:=後面我留有乙個空格,值中包含空格時使用引號。

由於echo有版本上的差異,會導致在unix版本間很難移植,因此我們一般使用最簡單的echo形式,而我們常用的是prinf命令,它別echo更靈活和強大。printf命令模仿c程式庫里的printf,它幾乎複製了該函式的所有功能,可也檢視man手冊。

標準輸入/輸出是軟體設計原則裡非常重要的概念:程式應該有資料的**端、資料的目的端以及報告問題的地方,他們粉筆被稱為標準輸入(standard input)、標準輸出(standard output)以及標準錯誤輸出(standard error).

shell提供了數種語法標記,可用來改變預設i/o的**端和目的端,如《改變標準輸入、>改變標準輸出、>>附加到檔案、|建立管道。

補充:>改變標準輸出、>>附加到檔案,>和》都會在檔案不存在的時候建立,>>當檔案存在時會補充到檔案後面。

這是unix系統提供了兩個對shell程式設計特別有用的兩個特殊檔案:

/dev/null是大家所熟知的位桶(bit bucket),傳送到此檔案的資料會被作業系統丟掉,相對地,讀取它則會立即返回檔案結束符號。

/dev/tty是當前程序的控制終端檔案,當程式開啟此檔案時,unix會自動將它重定向到乙個終端,在程式必須讀取人工輸入時特別有用,用它產生錯誤資訊也很不錯,只是很少有人這樣用

關於/dev/tty/的詳解我覺得這篇部落格很不錯

也是在$path路徑中查詢,但linux的path與windows的path不同是用「:」分隔,而不是「;」,可與修改.profile來永久生效path.

可與在執行指令碼的時候對它傳參,各引數都是通過整數來命名,基於歷史的原因,當它超過9個就要大括號把數字括起來,如:

#! /bin/sh

echo

$1echo

$

為了除錯shell可開啟跟蹤(execution tracing)功能,有兩種方式:向sh傳遞引數和shell通過set來設定。

sh -x testshell #可與通過man sh檢視sh的引數幫助

#! /bin/sh

set -x #開啟跟蹤功能

echo a

echo b

set +x #關閉跟蹤功能

參考部落格:

shell指令碼學習指南 學習筆記 1 6章

grep 找資料 sed 替換輸資料 cut 格式化文件 join 連線,連線前排序 sort 排序資料 uniq 資料排重 fmt 格式化文字 awk 重組資料,文字 wc 計算行數l,位元組數c,字數w lp 列印 tr 轉義字元 readonly 設為唯讀 export 匯入當前環境 unse...

Shell指令碼學習指南 入門

關於指令碼第一行的 符號注意的幾點 不是必須存在,但存在比不存在好。最好跟上全路徑,長度不易太長最好不要超過64個字元。shell的基本元素 命令與引數 三種基本命令 內建命令,shell函式,外部命令 如 usr bin,usr local bin 變數 變數名以字母或下劃線開頭,長度無限制,內容...

Shell 指令碼學習指南 讀書筆記01

1.入門 why簡單性 可移植性 易開發性 who wc l 統計使用者個數 管道 指令碼開頭一般寫法 bin sh 注意盡量不要超過64個字元 重定向及管道 特殊檔案 dev null exp if grep pattern myfile dev null then else fi 主要是獲得執行...