版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、基礎Shell文檔V2.1本章菜單1 Shell基礎:2 Bash shell主要優(yōu)點3 shell編程必須知道的基本語法:4 結構化命令編程:5 如何向程序里面?zhèn)鬟f參數(shù)6 如何定時運行程序和如何讓程序開機時運行7 shell腳本函數(shù)8 附錄【注】更新日期:2014年7月12日1 Shell基礎:1.1 Shell定義在計算機科學中,Shell俗稱殼(用來區(qū)別于核),是指“提供使用者使用界面”的軟件(命令解析器)。它類似于DOS下的command和后來的cmd.exe。它接收用戶命令,然后調用相應的應用程序。只要能都操作應用程序的接口的都能稱為shell。狹義的shell指的是命令行方面的軟件
2、,包括本章要介紹的bash等,廣義的shell則包括圖形界面的軟件。1.2 為什么要使用shell在Linux系統(tǒng)中,雖然有各種各樣的圖形化接口工具,但是shell仍然是一個非常靈活的工具。Shell不僅僅是命令的收集,而且是一門非常棒的編程語言。您可以通過使用shell使大量的任務自動化,shell特別擅長系統(tǒng)管理任務,尤其適合那些易用性、可維護性和便攜性比效率更重要的任務。1.3 如何建立一個腳本Linux中有好多中不同的shell,但是通常我們使用bash (bourne again shell) 進行shell編程,因為bash是免費的并且很容易使用。所以在本文中筆者所提供的腳本都是使
3、用bash(但是在大多數(shù)情況下,這些腳本同樣可以在bash的大姐,bourne shell中運行)。如同其他語言一樣,通過我們使用任意一種文字編輯器,比如nedit、kedit、emacs、vi等來編寫我們的shell程序。程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統(tǒng)它后面的參數(shù)是用來執(zhí)行該文件的程序。在這個例子中我們使用/bin/sh來執(zhí)行程序。當編輯好腳本時,如果要執(zhí)行該腳本,還必須使其可執(zhí)行。要使腳本可執(zhí)行:chmod u+x filename然后,您可以通過輸入: ./filename 來執(zhí)行您的腳本。2 Bash shell主要優(yōu)點2.1 命
4、令記憶能力(history)2.2 命令與文件補全功能(Tab按鍵的功能)Tab接在一串命令的第一個字的后面,則為命令補全;Tab接在一串命令的第二個字的后面,則為文件補全2.3 命名別名設置功能(alias)2.4 作業(yè)控制、前臺、后臺控制(job control,foreground,background)2.5 程序腳本(shell script)-批處理文件2.6 通配符(Wildcard)3 shell編程必須知道的基本語法:3.1 如何使用多個命令方法一:在終端上使用“;”來隔開不同的命令方法二:創(chuàng)建一個shell 腳本3.2 如何創(chuàng)建一個shell腳本-shell腳本的基本格式#
5、!/bin/bash#this is the first shelldatewho#the end3.3 如何運行一個shell腳本程序-加可執(zhí)行權限chmod u+x test./test3.4 shell腳本中的echo命令-相當于c語言中的printf·格式如下:echo This is a testecho “This is a test to see if it will work”echo Rich says “scripting is easy” . 【要輸出雙引號】echo “Lets see whos logged into the system: ”【要輸出單引號
6、】echo n 的用法 【不輸出回車】3.5 使用變量a) 環(huán)境變量b) 用戶變量在變量名字前面加上$符號來引用變量的值如:days=10 #等于號兩邊不能有空格guest=”Katie”echo “$guest will visite us $day days after”3.6 反引號-是shell腳本中最重要的特性之一,反引號允許你將shell命令的輸出賦值給一個變量,注意shell中的變量不需要顯式指定類型,系統(tǒng)會自動識別,可以直接調用如:testing=dateecho “The date and time are: ”$testing一個讓系統(tǒng)自動創(chuàng)建日志文件日期的方法:today
7、=date +%y%m%dls /usr/bin al > log.$today echo后必須有空格3.7 重定向輸入和輸出c) 輸出重定向command > outputfile【注】使用>時,會覆蓋原文件,使用>>時,會追加到原文件中;d) 輸入重定向command < inputfile【注】使用<時,會覆蓋原文件,使用<<時,會追加到原文件中;內聯(lián)輸入重定向command << markersentencesmarker*如:wc<<EOF“hello”“wangbing”“xiaofeng”EOF3.8
8、管道 command | commandrpm qa | morerpm qa | sort3.9 如何在shell中進行數(shù)學運算e) expr命令-只能進行整數(shù)類型的運算,且需要使用反引號來獲取expr命令的輸出如:sramlocalhost shell$ expr 3 + 58sramlocalhost shell$ expr 3 - 5-2sramlocalhost shell$ expr 3 / 50sramlocalhost shell$ expr 3 * 5expr: 語法錯誤sramlocalhost shell$ expr 3 * 515乘除運算符需要添加轉義,另外運算符左右必
9、須有空格f) 使用方括號來代替expr命令進行運算格式:var=$ 運算表達式 g) 進行浮點運算的解決方法,使用shell內建的bash計算器,小數(shù)點位數(shù)是由scale變量來控制的如終端下使用:bc q #終端輸入3.44 / 50 #結果scale=4 #設置scale3.44 / 5.6880 #結果quitshell腳本中使用:格式:var=echo “options; expression” | bc如:#!/bin/bashvar1=echo “scale=4; 3.44 / 5” | bcecho The answer is $var1如何進行多個表達式的運算:#!/bin/ba
10、shvar1=10.46var2=43.67var3=33.2var4=71var5=bc << EOFscale=4 #小數(shù)點的位數(shù)為4a1 = ($var1 * $var2)a2 = ($var3 * $var4)a1 + a2EOF變量a1、a2和var1等是不同的,顯示變量只能是var5等3.10 命令的退出狀態(tài)碼,每個命令都有一個退出狀態(tài)碼,成功執(zhí)行為0,不成功非0,用echo $?命令可以查看退出狀態(tài)碼,但是用exit 命令可以指定退出狀態(tài)碼的值4 結構化命令編程:4.1 條件語句系列(1)使用if-then語句,格式如下:if commandthencommandsf
11、i或者if command ; thencommandsfi(2)使用if then else 語句,格式如下:if commandthencommandselsecommandsfi(3)嵌套使用if,格式如下:if command1then commandselif command2thenmore commandsfi(4)前面所講的if-else語句,if只能接受shell命令作為判斷條件,不能接受普通的任意表達式,使用test可以克服這個缺點,格式如下:if test conditionthen commandsfi或者if commands then commandsFi建議使用中
12、括號形式 test命令可以判斷3類條件:·數(shù)值比較n1 eq n2;檢查n1,n2是否相等n1 ge n2;檢查n1是否大于等于n2n1 gt n2;檢查n1是否大于n2n1 le n2;檢查n1是否小于等于n2n1 -lt n2;檢查n1是否小于n2n1 ne n2;檢查n1是否不等于n2·字符串比較str1 = str2;檢查str1是否和str2相同str1 != str2;檢查str1是否和str2不同str1 < str2;str1 > str2-n str1;檢查str1的長度是否非0即notzero-z str1;檢查str1的長度是否為0
13、3;文件比較-d file;檢查file是否存在并是一個目錄-e file;檢查file是否存在-f file;檢查file是否存在并是一個文件-r file;檢查file是否存在并可讀-s file;檢查file是否存在并非空-w file-x file-O file;檢查file是否存在并屬當前用戶所有-G file ;檢查file是否存在并且默認組與當前用戶相同file1 nt file2;檢查file1是否比file2新file1 ot file2;檢查field1是否比file2舊*如:找出a,b,c中的最小值 #!/bin/bash 8 a=5 9 b=6 10 c=8 11 if
14、 $a -gt $b 12 then 13 min=$b 14 else 15 min=$a 16 fi 17 18 echo "min1=:"$min 19 20 if $min -gt $c 21 then 22 min=$c 23 fi 24 25 echo "min2=:"$min(5)前面我們所講的if-then語法格式并不符合我們c語言中的格式,現(xiàn)在我們來講一下if-then的高級特性a) 使用雙圓括號(有些地方稱作雙尖括號)允許你將高級數(shù)學表達式放入進行比較如:if ( $var1 * 2 > 90 ) thencommandsfi雙
15、尖括號里面可以識別的命令符號:var+, var-, +var, -var, !邏輯求反, 位求反, *冪運算, <<, >>, &, |, &&, |有了這些,我們的shell就和c語言的語法比較接近了。b) 使用雙方括號 expression 針對字符串進行比較的高級特性,對字符串進行模式匹配如:#!/bin/bashif $USR = r* thenecho “Hello $USR”elseecho “Sorry, I dont know you”fi(6)用case命令來替換if-then-else語句,對比c語言語法格式來學習直接來例子
16、進行比較:例子1:#!/bin/bashif $USER = “Rich” thenecho “welcome $USER”elif $USER = “barbara” thenecho welcome $USERelif $USER = testing thenecho welcome $USERelseecho ”sorry, you are not allowed here”fi例子2:case $USER in #想當于switch(USER)Rich | Barbara)echo “Welcome, $USER”;#注意結尾符號testing)echo “Welcome, $USER
17、, nice your visite”;*) #相當于defaultecho “sorry, we are not allowed here”;esac #結束標識4.2 循環(huán)語句系列(1) for命令格式for var in listdocommandsdone用var讀取list里面的值進行遍歷輸出如:for test in Albame Alaska Arizona Californiadoecho The next place is $testdone 如:for file in /etc/*doif -d “$file” thenecho “$file is a directory”
18、elif -f “$file” thenecho “$file is a file”fidone(2) c語言風格的for命令for ( a = 1; a < 10; a+ )doecho “The number is $a”done(3) while命令格式:while command docommandsdone如:var1=10while $var1 gt 0 doecho $var1var1=$ $var1 1 done(4) until命令,與while命令工作的方式相反格式:until commands do commandsdone(5) 嵌套循環(huán)如:for ( a = 1
19、; a <= 3; a+ )doecho “Starting loop $a: ”for ( b = 1; b <= 3; b+ )doecho“ Insert loop $b”donedone循環(huán)語句一個比較有實際意義的用法是循環(huán)處理文件數(shù)據(jù)IFS默認值為空格,如你可以編程實現(xiàn)逐行遍歷/ets/passwd文件并輸出內容,這里你需要將IFS變量的值改為冒號【注】IFS(Internal Field Seperator)在Linux的shell中預設的分隔符,用來把command line分解成word(字段)。IFS的設置方法很簡單,和普通變量設置方法類似:IFS=":
20、"如:#!/bin/bashecho entry=$entryIFS.OLD=$IFSIFS=$'n'for entry in cat /etc/passwddoecho "Value in $entry -"IFS=:for value in $entrydoecho "$value"donedoneIFS=$IFS.OLD(6) break 命令和continue 命令 使用break 1可以跳出當前循環(huán),break 2跳出兩次循環(huán)如:#!/bin/bashfor (a = 1; a < 4; a+)doecho &q
21、uot;Outer loop: $a"for (b = 1; b < 100; b+)doif $b -eq 5 thenbreakfiecho "在第 $b 循環(huán)"donedone如2:#!/bin/bashfor (var1 = 1; var1 < 15; var1+)doif $var1 -gt 5 && $var1 -lt 10 then continue fiecho "Interaction is $var1"done(7)處理循環(huán)的輸出,你可以添加一個命令將循環(huán)的輸出不顯示在屏幕上,而是重定向到一個文件
22、夾只需要在done命令后加上如:done > output.txt5 如何向程序里面?zhèn)鬟f參數(shù)前面我們程序里面需要的變量都是預先定義賦好值的,不能進行交互式的輸入,這在一般程序設計時是不可能的,現(xiàn)在我們講一下如何向程序里面?zhèn)鬟f參數(shù)5.1 第一種方法是用命令行參數(shù)來向程序傳遞參數(shù)如:./test 3 5,這個命令行我們輸入了三個參數(shù),在程序里直接對應$0,$1,$2,它們相當于變量的名字,在程序里可以直接調用,相當于$1=3, $2=55.2 另一種方法是用read命令,可以讓你在程序執(zhí)行期間進行輸入,如:echo n “Enter your name: ”read nameecho “He
23、llo $name, nice name. ”從文件test中讀取內容的方法:count=1cat test | while read linedoecho “Line $count: $line”count=$ $count + 1 doneecho “I have finished read file”6 如何定時運行程序和如何讓程序開機時運行6.1 用at 命令來計劃執(zhí)行作業(yè)at -f filename time6.2 at命令只能讓程序在某個時間只執(zhí)行一次,運用cron時間表可以讓我們實現(xiàn)定期要執(zhí)行的腳本cron時間表命令格式如下:min hour dayofmonth month d
24、ayofweek command(腳本全路徑)6.3 開機時運行腳本,很簡單,只要你將你要運行的腳本放在開機時需要執(zhí)行的腳本文件夾下就可以了,當然具體執(zhí)行的時候還涉及到很多內容,這里不詳述了。7 shell腳本函數(shù)7.1基本腳本函數(shù)(1).創(chuàng)建函數(shù)兩種方法:a.function namecommandsb. name( ) commands如:注意:每個函數(shù)名必須唯一,如果重新定義函數(shù)那么新定義將取代函數(shù)原先的定義,而這不會引發(fā)錯誤消息。7.2函數(shù)退出狀態(tài)Bash shell將函數(shù)看作小型腳本,并以退出狀態(tài)結束,函數(shù)退出狀態(tài)有三種方式a) 使用標準變量$?來確定函數(shù)的退出狀態(tài)b) 使用retu
25、rn命令c) 使用函數(shù)輸出7.3向函數(shù)傳遞參數(shù)如下:這里的函數(shù)所使用的參數(shù)值為私有的參數(shù)環(huán)境變量,所以函數(shù)無法從腳本命令行訪問腳本參數(shù)值,即函數(shù)所使用的變量$1和$2,不同于腳本主代碼的變量$1和$2,如果函數(shù)想使用,必須在調用該函數(shù)時手動傳遞這些數(shù)據(jù)。7.4函數(shù)使用的全局變量和局部變量(1)全局變量是在shell腳本內處處有效的變量。默認情況下,腳本中定義的變量都是全局變量,在函數(shù)外部定義的變量,在函數(shù)內部仍能正常訪問(2)與全局變量相對,函數(shù)內部使用的變量可以稱為局部變量,只需要在局部變量前面冠以local關鍵字,關鍵字local確保變量僅在函數(shù)內部使用,如果腳本在函數(shù)外部有同名變量,那么
26、shell將能區(qū)分開這兩個變量。8 附錄8.1 PS1使用詳解使用方法:# PS1='自定義內容'注意兩邊的單引號示例: PS1='(uH d t)$'-PS1:就是用戶平時的提示符。PS2:第一行沒輸完,等待第二行輸入的提示符。Linux系統(tǒng)提示符是用系統(tǒng)變量PS1來定義的。一般系統(tǒng)默認的形式是:usernamehost 工作目錄$.用echo $PS1可以得到PS1的值,即PS1="uh w"$登錄后可以更改PS1的顯示樣式,但是當退出重啟登錄進入系統(tǒng)后,樣式又變成系統(tǒng)默認的樣式了,如果要徹底改變它的樣式,只能從配置文件中改。PS是在用戶
27、根目錄下的.bash_profile中定義的。如# .bash_profile# Get the aliases and functionsif -f /.bashrc ; then. /.bashrcfi# User specific environment and startup programs#以下是設定的PS1的值PS1="uh w$"PATH=$PATH:$HOME/bin#使用export把PS1輸出,以使它可以在子shell中生效,這會造成ROOT用戶的也采用此樣式#export PS1 要慎用export PATHunset USERNAME下面簡單說說環(huán)境下默認
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級歷史上冊第二單元夏商周時期:早期國家與社會變革第5課青銅器與甲骨文同步練習新人教版
- 2024-2025學年高中英語Unit2TheuniversallanguageSectionⅦGuidedWriting學案含解析牛津譯林版選修8
- 玉溪師范學院《管理學》2021-2022學年第一學期期末試卷
- 玉溪師范學院《電力電子技術》2021-2022學年期末試卷
- 玉溪師范學院《導視設計》2023-2024學年第一學期期末試卷
- 2024電力建設工程設計合同范本
- 2024民間借款居間服務合同范本
- 2024年重組抗原診斷試劑合作協(xié)議書
- 2024小型房屋建筑合同書樣本
- 2024國有土地買賣合同參考范文
- 銅仁市房地產(chǎn)行業(yè)報告
- 多文本閱讀教學設計八年級
- 酒店前廳部英語培訓及酒店前廳部服務規(guī)范培訓材料
- 省略與替代講解與訓練
- 眼視光學專業(yè)解析
- 超聲科室發(fā)展規(guī)劃方案
- 微信小程序的品牌營銷渠道與策略研究
- 2024屆高三化學二輪復習課件 生產(chǎn)應用無機工業(yè)流程題的解法及策略(共96張)
- 作業(yè)崗位風險評估報告
- 幼兒園公開課:小班社會《小熊你好》課件
- 生物信息學前沿探索
評論
0/150
提交評論