shell基礎一

•   Shell 就是一個程序,能解釋用戶輸入的命令和腳本

•   閱讀現成的 Shell腳本:哪裏去找?

•    Linux rc 腳本: 啓動各種服務的腳本

位於  /etc/init.d/rc開始啓動

•    configure 腳本: 配置編譯環境的腳本

•    通過 autotools 自動生成的

•    大部分 tar.gz 源碼包解開後都有

•    手冊:

•    info bash

•    rc: 第一個 Shell 腳本,rc 的作用: 啓動 OS

•    查看當前環境所用shell:echo $SHELL

•     

Shell類型

    UNIX和LINUX上常見的shell一般有5種,它們是Bourne shell, C shell, Korn shell, Bash shell和TC shell,現在我們的機器上這幾種shell都有。這幾個shell分爲兩大分支,一個是Bourne shell和其延伸版本,一個是C shell和其延伸版本。

 

1      怎樣編寫SHELL

利用vi編輯器編輯腳本,將腳本命名爲腳本功能.sh

Shell腳本不是複雜的程序,它是按行解釋的,腳本第一行總是以 #!/bin/sh 開頭,它通知系統以下的Shell程序使用系統上的Bourne Shell來解釋。

第二行註釋中寫入腳本名,第三行註釋開始寫入腳本功能——習慣。

以下行進入腳本正式編寫

編寫完後給腳本添加執行權限:

     chmod u+x ScripName

運行腳本:ScripName  或  ./ScripName

簡單腳本示例:

vi ShowHello.sh

bash路徑查詢:

E0247F00-2436-0000-1000-1DD300002500:/home/fsp/cxy # export | grep bash

declare -x ENV="/etc/bash.bashrc"

declare -x SHELL="/bin/bash"

以下爲腳本內容:

#!/bin/sh   

#ShowHello.sh

#To show hello to somebody

echo -n“Enter Your Name:”

read NAME

echo “Hello,$NAME!” 

保存,退出vi編輯器。

爲腳本添加可執行權限:

chmod u+x ShowHello.sh

運行腳本:ShowHello.sh : sh  ShowHello.sh

 

/dev/null

      是一個虛設的設備,俗稱“Linux黑洞”,任何對/dev/null的寫入都會成功,但數據會消失得無影無蹤,沒有任何反饋。所以經常把不想在屏幕顯示的信息全部送到/dev/null中,在shell腳本中用得比較多。

 如:ls  –l > /dev/null

還可以用來清空文件的內容:cat /dev/null > FileName

 

2      命令

本地變量基本命令:

echo      可以顯示單個變量取值,並在變量名前加 $

unset     命令清除變量

set        命令顯示所有本地定義的s h e l l變量

set val = 32

echo $val

unset  val   

 

環境變量與本地變量設置方式相同,可以使用env命令可以查看所有的環境變量

echo         可以顯示單個變量取值,並在變量名前加 $

export      設置環境變量

unset        命令清除變量

export  LM_LICENSE_FILE = 300@SHHW84

命令read從鍵盤讀取變量var的值:

   read var

   echo $var

文件重定向

 

Ö  作用:改變輸出方向或輸入來源

Ö  使用說明:

ó  cmd > file

將標準輸出重定向到新文件file中

ó  cmd >> file

將標準輸出重定向追加到文件file中

ó  cmd > file 2>&1

將標準輸出和標準錯誤重定向到文件file

ó  cmd 2 > file

將標準錯誤重定向到新文件file中

ó  cmd >> file 2>&1 

將標準輸出和標準錯誤重定向追加到文件file

ó  cmd < file1 > file2 

cmd以file1爲輸入,file2爲輸出

ó  cmd < file  

cmd以file爲標準輸入

ó  cmd << delimiter

從標準輸入裏面讀入,直到遇到delemiter分界符

字符串比較操作符

===

兩個字符串相同

!=

兩個字符串不等

-z

空串

-n

非空串

數字邏輯操作符

-eq

數值相等

-ne

數值A 不等於數值B

-gt

數值A 大於數值B

-lt

數值A 小於數值B

-le

數值A小於等於數值B

-ge

數值A大於等於數值B

文件狀態邏輯操作符

-d

該文件是目錄

-f

該文件爲正規文件

-L

該文件爲符號鏈接

-r

該文件可讀

-s

文件長度大於0

-w

該文件可寫

-x

該文件可執行


 

 

Shell文件操作

寫文件

       >, >>, tee, tee –a

讀文件

       read, <

cat 顯示文本內容,可實現文本插入

touch 實現文件時間戳操作

IF語句

 

if expr1      # 如果expr1 爲真(返回值爲0)

then          # 那麼

   commands1  # 執行語句塊 commands1

elifexpr2    # expr1 不真,而expr2 爲真

then          # 那麼

   commands2  # 執行語句塊 commands2

 ... ...      # 可以有多個 elif語句

else          # else 最多只能有一個

   commands4  # 執行語句塊 commands4

fi            #if 語句必須以單詞 fi終止

 

 

CASE

 

case exprin # expr爲表達式,關鍵詞in不要忘!

  pattern1# exprpattern1匹配,注意括號

   commands1 # 執行語句塊commands1

   ;;        # 跳出case結構

  pattern2# exprpattern2匹配

   commands2 # 執行語句塊commands2

   ;;        # 跳出case結構
 
... ...    # 可以有任意多個模式匹配

  *)         # expr與上面的模式都不匹配

   commands  # 執行語句塊commands

   ;;        # 跳出case結構
esac         # case語句必須以esac終止

 

 

 

FOR

 

for variableinlist

# 每一次循環,依次把列表list中的一個值賦給循環變量

do          # 循環開始的標誌

  commands  # 循環變量每取一次值,循環體就執行一遍

done        # 循環結束的標誌

 

 

執行第一輪循環時,將 list中的第一個詞賦給循環變量,並把該詞從 list中刪除,然後進入循環體,

執行 dodone之間的命令。下一次進入循環體時,則將第二個詞賦給循環變量,並把該詞從 list 中刪除。

以後的循環以此類推。當 list中的詞全部被移走後,循環結束。

 

while 循環語句

 

while expr  # 執行expr

do # expr的退出狀態爲0,進入循環,否則退出while

  commands  # 循環體

done       

先執行 expr,如果其退出狀態爲 0,就執行循環體。執行到關鍵字 done後,回到循環的頂部,while命令再次檢查 expr的退出狀態。以此類推,循環將一直繼續下去,直到 expr的退出狀態0 爲止,循環結束。

until 循環語句

until expr  # 執行 expr

do # expr的退出狀態非0,進入循環,否則退出until

  commands  # 循環體

done        # 循環結束標誌,返回循環頂部

while循環類似,區別是當 expr退出狀態非 0 時才執行循環體,直到 expr0 時退出循環。

 

break continue 命令

 break n

break用於強行退出當前循環
如果是嵌套循環,break後面可以加數字 n,控制退出第 n重循環

  (最內層爲第 1層)

continue n

continue用於忽略本次循環的剩餘部分,回到循環的頂部,繼續開始下一次循環
如果是嵌套循環,continue後面可以加數字 n,表示回到第 n重循環的頂部

  (最內層爲第 1層)

 

exit sleep 命令

 exit n

exit用於退出腳本或退出當前進程。n是一個範圍在 [ 0 , 255 ] 的整數,0表示成功退出,0表示遇到某種失敗而異常退出,該整數變量被保存在狀態變量 $?

sleep n

sleep 用於暫停n 秒鐘

 

 

shift 命令

shift n

lshift用於將 參量列表 list左移 n次,缺省爲左移 1
l參量列表一旦被移動,最左端的參量即被從列表中刪除
lwhile循環中常用 shift實現對位置參量列表的遍歷

 

 

$?:表示命令返回值,一般情況,0表示成功,其他表示失敗;

$#:表示函數體執行時候,傳入該函數的參數個數;

$@:表示傳入函數體所有參數信息;

 

Shell腳本中的函數

functionfunction_name {

   commands

}

function_name() {

   commands

}

 

l函數定義

#!/bin/bash

fun1 () { echo "This is a function"; echo; }

# 一個函數可以寫成一行,但命令之間必須用分號隔開

# 特別注意,最後一個命令後面也必須加分號

fun2 ()

   echo "This is fun2."

   echo "Now exiting fun2."

}

 

函數調用

function 函數名()

{

    執行體

}

調用語法結構:

函數名 參數1 參數2 …

函數調用中,使用$+n來解析參數,其中n表示第幾個參數。其他的與函數體外規則基本一致。

另外,$?:表示命令返回值,一般情況,0表示成功,其他表示失敗;

  $#:表示函數體執行時候,傳入該函數的參數個數;

$@:表示傳入函數體所有參數信息;

 

示例:

#!/bin/sh

 

#定義函數

function Func()

{

echo P_count = $#

echo p_all = $@

echo P1 = $1

echo P2 = $2

 

return 100

}

#調用函數Func

Func x1 x2

echo “Return Value = $?”

 

 

 

3      常用字符串處理命令

3.1      grep

grep命令在shell腳本中被大量的使用,對文本進行模式匹配查找,並打印符合模式的所有行

一般格式爲:

grep [options]基本正則表達式 [files]

常用的options有:

-c只輸出匹配行的計數

-i不區分大小寫

-h查詢多文件時不顯示文件名

-l查詢多文件時只輸出包含匹配字符的文件名

-n顯示匹配行及行號

-s不顯示不存在或無匹配文本的錯誤信息

-v顯示不包含匹配文本的所有行

例如:

ps -ef | grep --color –w –i "proc"

輸出:

root    22718  4664  0 01:26 pts/0   00:00:00 grep --color -w -i proc

root 29267 28514  2 00:57 ? 00:00:40 /opt/ne/0000/proc/00000000/prog/sbu.bin ,0,0,0,0 0

root  30719 28514  1 00:57 ?  00:00:33 /opt/ne/0000/proc/00000001/prog/rmu.bin 0,0,0,0,1 0

 

3.2      awk

awk命令可以通過制定分隔符來識別文本的列,然後對文本進行處理和格式化。

awk常用的格式爲:

awk [–F ‘列分隔符’] ‘執行腳本’ files

其中,在執行腳本中$1、$2 … 標識某行的第1列、第2列 …

 

3.3      SORT排序

該命令用於對文本進行排序,類似於UE中排序功能;

使用格式:

sort [options] [fils]

例如:

ll | sort -k2  ////使用第2列進行排序

 

3.4      uniq

該命令一般情況下和sort配合使用,對文本進行唯一性過濾操作。

使用格式:

uniq [OPTION] [INPUT [OUTPUT]]

 

4      調試shell程序

寫好的Shell腳本,在其運行結果不正確的情況下,需要對程序進行調試。除了大家都能想到的通過echo命令在某些點打印變量信息外,bash提供了另外的調試功能,即“bash –x 腳本名稱”,通過該命令的輸出結果可以清楚看到程序的執行流程和每個變量在某點的值。這種方法被廣泛應用到實際工作中,可以幫助我們很快的定位問題。另外,我們也可以在腳本中使用調試開關。打開調試開關:set –x; 關閉調試開關:set +x 來具體根據腳本中某塊執行情況。

示例:

 

5      管道使用說明

作用:將一個命令的輸出作爲另一個命令的輸入

格式:命令1 |命令2

實例:

% echo “1 2 3” | awk ‘{print $2}’

2

6      本地變量

設置

<varname>=<value>

引用

$<varname>

清除

unset <varname>

 

7      環境變量

設置

<varname>=<value>

export <varname>    #引出變量爲環境變量

引用和清除

同本地變量

 

8      引號

“ ”  引用除$ \ `外的任意字符

‘ ’  屏蔽任何引用

` `  將反引號中的內容作爲一個系統命令執行

\  轉義標誌

% cat test.sh

#!/bin/sh

firstname=“Liu”

echo “How are you, Mr. $firstname ?”

echo ‘How are you, Mr. $firstname ?’

`uname`

echo “I have \$600.”

% ./test.sh

How are you, Mr. Liu ?

How are you, Mr. $firstname ?

SunOS

I have $600

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章