• 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
l 命令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) # 若expr與pattern1匹配,注意括號
commands1 # 執行語句塊commands1
;; # 跳出case結構
pattern2) # 若expr與pattern2匹配
commands2 # 執行語句塊commands2
;; #
跳出case結構
... ...
# 可以有任意多個模式匹配
*) # 若expr與上面的模式都不匹配
commands # 執行語句塊commands
;; #
跳出case結構
esac
# case語句必須以esac終止
FOR
for variableinlist
# 每一次循環,依次把列表list中的一個值賦給循環變量
do # 循環開始的標誌
commands # 循環變量每取一次值,循環體就執行一遍
done # 循環結束的標誌
執行第一輪循環時,將 list中的第一個詞賦給循環變量,並把該詞從 list中刪除,然後進入循環體,
執行 do和 done之間的命令。下一次進入循環體時,則將第二個詞賦給循環變量,並把該詞從 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 時才執行循環體,直到 expr爲 0 時退出循環。
break n
(最內層爲第 1層)
continue n
(最內層爲第 1層)
exit n
sleep n
shift n
$?:表示命令返回值,一般情況,0表示成功,其他表示失敗;
$#:表示函數體執行時候,傳入該函數的參數個數;
$@:表示傳入函數體所有參數信息;
Shell腳本中的函數
functionfunction_name {
commands
}
function_name() {
commands
}
#!/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