Shell指令碼入門筆記

2021-09-23 21:08:49 字數 4656 閱讀 6161

如同其他語言一樣,通過我們使用任意一種文字編輯器,比如 nedit、kedit、emacs

、vi 等來編寫我們的 shell 程式。程式必須以下面的行開始(必須方在檔案的第一行):

#!/bin/sh

符號#!用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使

用/bin/sh 來執行程式。

當編輯好指令碼時,如果要執行該指令碼,還必須使其可執行。

要使指令碼可執行:

chmod +x filename

然後,您可以通過輸入: ./filename 來執行您的指令碼。

在其他程式語言中您必須使用變數。在 shell 程式設計中,所有的變數都由字串組成,

並且您不需要對變數進行宣告。

>>本地變數

設定變數

引用變數

清除變數

檢視變數

>>環境變數

設定環境變數:

• 引用環境變數 :

• 常用環境變數

– home

– path

– term

– uid

– pwd

– ps1

>>特殊的預定義變數

$#:儲存shell程式中命令列引數的個數

$?:儲存shell中上乙個程式執行的返回值(0表 示命

令執行成 功,非0有問題)

$0:儲存shell程式自己的名稱

$[1-n]:儲存第[1-n]個命令列引數∗:

儲存sh

ell腳

本的所有

引數(不

包含0)$$:儲存shell指令碼的程序號(pid)

$!:儲存上乙個後台執行命令的程序號(pid)

通過乙個簡單的test.sh指令碼來學習:

12

3

4

5

6

#!/bin/sh

echo"number:$#"

echo"scname:$0"

echo"first :$1"

echo"second:$2"

echo"argume:$@"

執行指令碼:

12

3

4

5

6

# ./test.sh aa bb

number:2

scname:./test02.sh

first :aa

second:bb

argume:aa bb

通過顯示結果可以看到: 

$# 是傳給指令碼的引數個數 

$0 是指令碼本身的名字 

$1是傳遞給該shell指令碼的第乙個引數 

$2是傳遞給該shell指令碼的第二個引數 

$@ 是傳給指令碼的所有引數的列表

echo "some text": 將文字內容列印在螢幕上

ls: 檔案列表

wc -l filewc -w filewc -c file&: 計算檔案行數計算檔案中的單詞數計算檔案中

的字元數

cp sourcefile destfile&: 檔案拷貝

mv oldname newname : 重新命名檔案或移動檔案

rm file&: 刪除檔案

grep 'pattern' file&: 在檔案內搜尋字串比如:grep 'searchstring'

file.txt

cut -b colnum file&: 指定欲顯示的檔案內容範圍,並將它們輸出到標準輸出裝置

比如:輸出每行第 5 個到第 9 個字元 cut -b5-9 file.txt 千萬不要和 cat 命令混淆,這是兩

個完全不同的命令

cat file.txt: 輸出檔案內容到標準輸出裝置(螢幕)上

file somefile&: 得到檔案型別

read var: 提示使用者輸入,並將輸入賦值給變數

sort file.txt: 對 file.txt 檔案中的行進行排序

expr: 進行數**算 example: add 2 and 3expr 2 "+" 3

find: 搜尋檔案比如:根據檔名搜尋 find . -name filename -print

tee: 將資料輸出到標準輸出裝置(螢幕) 和檔案比如:somecommand | tee outfile

basename file&: 返回不包含路徑的檔名比如: basename /bin/tux 將返回 tux

dirname file&: 返回檔案所在路徑比如:dirname /bin/tux 將返回 /bin

head file&: 列印文字檔案開頭幾行

tail file : 列印文字檔案末尾幾行

sed: sed 是乙個基本的查詢替換程式。可以從標準輸入(比如命令管道)讀入文字

,並將結果輸出到標準輸出(螢幕)。該命令採用正規表示式(見參考)進行搜尋。不

要和 shell 中的萬用字元相混淆。比如:將 linuxfocus 替換為 linuxfocus :cat

text.file | sed 's/linuxfocus/linuxfocus/' > newtext.file

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

if ....; then

....

elif ....; then

....

else

....

fi大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字串、判斷

檔案是否存在及是否可讀等等... 

通常用" [ ] "來表示條件測試。注意這裡的空格很重要。要確保方括號的空格。

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

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

[ -n "var

"]:判

斷var 變數是否有值

[ "a

"="b" ] :判斷a

和b 是否相等

乙個函式是這個樣子的

:functionname()

任何優秀的指令碼都應該具有幫助和輸入引數。

最簡單的除錯命令當然是使用 echo 命令。

可以使用 echo 在任何懷疑出錯的地方列印任何變數值。

shell 也有乙個真實的除錯模式。如果在指令碼"strangescript" 中有錯誤,您可以這

樣來進行除錯:

sh -x strangescript

這將執行該指令碼並顯示所有變數的值。

shell 還有乙個不需要執行指令碼只是檢查語法的模式。可以這樣使用:

sh -n your_script

這將返回所有語法錯誤。

shell中條件判斷if中的-z到-d的意義

[ -a file ] 如果 file 存在則為真。

[ -b file ] 如果 file 存在且是乙個塊特殊檔案則為真。

[ -c file ] 如果 file 存在且是乙個字特殊檔案則為真。

[ -d file ] 如果 file 存在且是乙個目錄則為真。

[ -e file ] 如果 file 存在則為真。

[ -f file ] 如果 file 存在且是乙個普通檔案則為真。

[ -g file ] 如果 file 存在且已經設定了sgid則為真。

[ -h file ] 如果 file 存在且是乙個符號連線則為真。

[ -k file ] 如果 file 存在且已經設定了粘制位則為真。

[ -p file ] 如果 file 存在且是乙個名字管道(f如果o)則為真。

[ -r file ] 如果 file 存在且是可讀的則為真。

[ -s file ] 如果 file 存在且大小不為0則為真。

[ -t fd ] 如果檔案描述符 fd 開啟且指向乙個終端則為真。

[ -u file ] 如果 file 存在且設定了suid (set user id)則為真。

[ -w file ] 如果 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 存在且是乙個套接字則為真。

Shell指令碼(三) Shell指令碼入門

1 指令碼格式 指令碼以 bin bash開頭 指定解析器 2 第乙個shell指令碼 helloworld 1 需求 建立乙個shell指令碼,輸出helloworld 2 案例實操 atguigu hadoop101 datas touch helloworld.sh atguigu hadoo...

shell 指令碼入門

shell 是乙個用 c 語言編寫的程式,它是使用者使用 linux 的橋梁。shell 既是一種命令語言,又是一種程式語言。shell 是指一種應用程式,這個應用程式提供了乙個介面,使用者通過這個介面訪問作業系統核心的服務。ken thompson 的 sh 是第一種 unix shell,win...

shell指令碼入門

str wxz echo 輸出 3 提取子字串 以下例項從字串第 2 個字元開始擷取 4 個字元 string the shell script is great echo 輸出 he s查詢子字串 查詢字元 i 或 s 的位置 string runoob is a great company ec...