Shell程式設計基礎

2021-09-11 04:48:28 字數 4074 閱讀 9116

為什麼要進行shell程式設計

linux中有許多種不同的shell,通常我們使用bash (bourne again shell) 進行shell程式設計,因為bash不僅免費(自由)且易於使用。本文提供的指令碼都用bash(當然大多數情況下,這些指令碼同樣可以在bash的前輩,bourne shell中執行)執行。

如同其他語言一樣,我們可以使用任意一種文字編輯器,比如nedit、kedit、emacs、vi等來編寫shell指令碼,它必須以如下行開始(必須放在檔案的第一行):

**: 全選

#!/bin/sh
**: 全選

chmod +x filename
這樣輸入 ./filename 便可執行該指令碼。

注釋

shell指令碼中以# 開始的行表示注釋,直到一行的結束。我們真誠的建議你在指令碼中使用注釋,這樣即便在相當長時間內沒有使用該指令碼,你也能在短時間內明白該指令碼的作用和工作原理;此外還有很重要的原因——有了注釋,更利於和別人分享你的指令碼。

變數

在其它程式語言中,你必須使用變數。shell程式設計中,所有變數都由字串組成,並且不需要宣告。要給乙個變數賦值,你可以這麼寫:

**: 全選

變數名=值
在變數名之前加乙個$,就可以取出變數值:

**: 全選

#!/bin/sh

#對變數賦值:

a="hello world"

# 列印變數a的值:

echo "a is:" $a

a is: hello world

有時候變數名可能會和其它文字混淆,比如:

**: 全選

num=2

echo "this is the $numnd"

上述指令碼並不會輸出"this is the 2nd",只會列印"this is the ";這是由於shell會去搜尋變數numnd的值,而實際上這個變數此時並沒有值。可以使用花括號來告訴shell我們要列印的是num變數:

**: 全選

num=2

echo "this is the $nd"

上述指令碼的輸出結果為: this is the 2nd

有許多變數是系統自動設定的,在後面用到這些變數時我們再作說明。如果你需要處理數學表示式,那麼得借助諸如 expr 的程式。

除了僅在指令碼內有效的普通shell變數外,還有環境變數,即那些由export關鍵字處理過的變數。本文不討論環境變數,因為一般只在登入指令碼中使用環境變數。

shell命令和流程控制

在shell指令碼中可以使用三類命令:

1) unix 命令:

儘管這些都不是系統命令,不過它們扮演著相當重要的角色。

管道 (|) 將乙個命令的輸出作為另外乙個命令的輸入。

**: 全選

grep "hello" file.txt | wc -l
上述命令會在file.txt中搜尋包含有」hello」的行並計算行數,這裡grep命令的輸出成了wc命令的輸入。當然您可以使用多個命令。

重定向:將命令的結果輸出到檔案,而不是標準輸出(螢幕)。

**: 全選

> 寫入檔案並覆蓋舊檔案

>> 加到檔案的尾部,保留舊檔案內容。

反短斜線

使用反短斜線可以將乙個命令的輸出作為另外乙個命令的乙個命令列引數。

**: 全選

find . -mtime -1 -type f -print
上述命令可以查詢過去24小時(-mtime –2則表示過去48小時)內修改過的檔案。如果你想將所有查詢到的檔案打乙個包,則可以使用以下指令碼:

**: 全選

#!/bin/sh

# the ticks are backticks (`) not normal quotes ('):

tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`

3) 流程控制

"if" 表示式如果條件為真則執行then後的部分:

**: 全選

if ....; then

....

elif ....; then

....

else

....

fi

大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字串、判斷檔案是否存在及是否可讀等等…通常用" [ ] "來表示條件測試,注意這裡的空格很重要,要確保方括號前後的空格。

**: 全選

[ -f "somefile" ] :判斷是否是乙個檔案

[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權

[ -n "$var" ] :判斷$var變數是否有值

[ "$a" = "$b" ] :判斷$a和$b是否相等

執行man test可以檢視所有測試表示式可以比較和判斷的型別。

直接執行以下指令碼:

**: 全選

#!/bin/sh

if [ "$shell" = "/bin/bash" ]; then

echo "your login shell is the bash (bourne again shell)"

else

echo "your login shell is not bash but $shell"

fi

變數$shell包含了登入shell的名稱,我們拿它和/bin/bash進行比較。

快捷操作符

熟悉c語言的朋友可能會很喜歡下面的表示式:

**: 全選

[ -f "/etc/shadow" ] && echo "this computer uses shadow passwors"
這裡的 && 就是乙個快捷操作符,如果左邊的表示式為真則執行右邊的語句。你也可以把它看作邏輯運算的與操作。上述指令碼表示如果/etc/shadow檔案存在,則列印」 this computer uses shadow passwors」。同樣或操作(||)在shell程式設計中也可以用,例如:

**: 全選

#!/bin/sh

mailfolder=/var/spool/mail/james

[ -r "$mailfolder" ] ||

echo "$mailfolder has mail from:"

grep "^from " $mailfolder

該指令碼首先判斷mailfolder是否可讀,如果可讀則列印該檔案中的"from" 一行。如果不可讀則或操作生效,列印錯誤資訊後指令碼退出。這裡有個問題,那就是我們必須有兩個命令:

-列印錯誤資訊

-退出程式

我們使用花括號以匿名函式的形式將兩個命令放到一起作為乙個命令使用。一般函式將在下文提及。不用與和或操作符,我們也可以用if表示式作任何事情,但是使用與或操作符會更便利很多。

case表示式可以用來匹配乙個給定的字串,而不是數字。

**: 全選

case ... in

...) do something here ;;

esac

讓我們看乙個例子,file命令可以辨別出乙個給定檔案的檔案型別,如:file lf.gz,該命令輸出結果為:

lf.gz: gzip compressed data, deflated, original filename,

last modified: mon aug 27 23:09:18 2001, os: unix

Shell 程式設計基礎

2 shell 程式設計基礎 shell 簡介認識後台程式 bash 程式設計熟悉 linux 系統下的編輯環境 熟悉linux 下的各種 shell 熟練進行 shell 程式設計熟悉 vi基本操作 熟悉emacs 的基本操作 比較不同 shell 的區別編寫乙個測試伺服器是否連通的 shell ...

shell程式設計基礎

1.熟悉shell 1.1 基本語法 bin bash shell必須以上面所示的開頭,以 開頭的語句表示注釋。1.2 新增可執行許可權 chmod u x 檔名 1.3 建立簡單的shell bin bash echo n hell user,today is date echo good luc...

shell 程式設計基礎

1.基礎正規表示式 aa 表示至少包含乙個a的行,a 匹配所有內容 匹配任意乙個字元,精準匹配 grep 提取文字中的字元 grep v root 取反不包括root的行 2.cut 命令 f第幾列 d分隔符 3.printf ni輸出n個整數 ns n個字元 m.nf m.nprintf s t ...