Tarena內達科技的資料—Shel編程_第1頁
Tarena內達科技的資料—Shel編程_第2頁
Tarena內達科技的資料—Shel編程_第3頁
Tarena內達科技的資料—Shel編程_第4頁
Tarena內達科技的資料—Shel編程_第5頁
已閱讀5頁,還剩73頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1copyright tarena corporation, 2008. all rights reserved.tarena high-end it t中國北京中國北京電話:(010)62135687、62136369地址:北京市海淀區北三環西路甲18號 中鼎大廈b座7層中國上海中國上海電話:(021)61202630、61202603地址:上海市北京東路668號 上海科技京城c區9層 加拿大多倫多加拿大多倫多電話:(416)491-6456 地址:suite 1208, deerford road, toronto, ontario, canada郵編:m2j 3j3中國廣州中國廣州電話:

2、(020)85518868、85518898 地址:廣州天河區崗頂僑鑫教育主樓三層shellshell編程編程20102010年年1212月月21.shell基礎基礎1.1. 什么是shell1.2. shell初始化過程1.3. shell與進程31.1. 什么是什么是shell1.1.1.shell是一個命令解釋器程序。字符操作系統與外部最主要的接口就叫做shell。shell是操作系統最外面的一層。shell管理你與操作系統之間的交互:等待你輸入,向操作系統解釋你的輸入,并且處理各種各樣的操作系統的輸出結果。shell程序解釋用戶的命令,不管是用戶直接輸入的或者從一個稱作shell腳本或

3、者shell程序文件讀入。bashcshc函數內核硬件41.1.2.shell腳本shell提供了你與操作系統之間通訊的方式。這種通訊可以以交互方式(從鍵盤輸入,并且可以立即得到響應),或者以shell script(非交互)方式執行。所以shell分交互式與非交互式shell。shell script是放在文件中的一串shell和操作系統命令,它們可以被重復使用。本質上,shell script是命令行命令簡單的組合到一個文件里面。shell腳本不僅僅是簡單的命令行組合,還遵循類似c語言的一樣的語法規則。51.1.3.shell的分類與歷史 bash最初的unix shell是由stephe

4、n r. bourne于20世紀70年代中期在新澤西的at&t貝爾實驗室編寫的,這就是bourne shell。該shell主要采用algol語言作為解釋語法,后來逐步改進形成不同版本的bash: bourne shell ( sh) ,korn shell ( ksh),bourne again shell ( bash) ,posix shell ( sh) cshbill joy于20世紀80年代早期,在berkeley的加利福尼亞大學開發了c shell。它主要是為了讓用戶更容易的使用交互式功能,并把algol風格的語法結構變成了c語言風格。 它新增了命令歷史、別名、文件名替換

5、、作業控制等功能。后來也逐步改進形成不同版本的csh: c shell ( csh) , tenex/tops c shell ( tcsh) 61.1.4.各主要操作系統下缺省的shellaix下是korn shell. solaris和freebsd缺省的是bourne shell. hp-ux缺省的是posix shell. redhat linux是bourne again shell.1.1.5.各shell對應的程序文件shell的程序在/bin/目錄下/bin/sh/bin/sh/bin/ksh/bin/ksh/bin/bash/bin/bash/bin/csh/bin/csh/

6、bin/tcsh/bin/tcsh71.2. shell初始化過程初始化過程1.2.1.shell啟動方式shell 可以運行為login shell或者login shell的子shell(subshell)。只有login命令可以調用shell作為一個login shell,或者在shell后使用-l與-login選項。1.2.2.登錄shell初始化相關腳本(非交互方式)/etc/profile/.bash_profile, 或者/.bash_login 或者 /.profile: 讀取第一個存在第一個存在的可讀取的文件 /.bash_logout 登出的時候。 1.2.3.非登錄she

7、ll相關腳本(交互方式)/.bashrc(使用-norc可以不調用)sh 被啟動默認不加載/.bashrc此文件通常也被 /.bash_profile啟動81.2.4.bash的其他啟動文件相關選項參數-init-file file#指定初始化腳本-rcfile file #指定替代標準 /.bashrc文件-login#等價于-l,啟動bash作為登錄shell-noprofile#不啟動 /etc/profile 或者任意初始化文件/.bash_profile, /.bash_login, /.profile.-norc #不驅動./bashrc- 表示選項結束91.2.5.交互式shel

8、l與非交互式shell交互式shell:shell指令來自標準輸入 bash -i bash -s 命令行參數 非交互式shell:shell指令來自文件或者來自字符串 bash shell腳本文件 bash -c “命令” 101.2.6.bash的選項開關 set -o #顯示選項 set o 選項名 #開啟選項 set +o 選項#關閉選項1.2.7.bash比較常用的選項開關 verbose noclobber history111.3. shell與進程與進程1.3.1.shell本身是一個進程,shell執行腳本也會啟動一個進程。由于進程啟動方式的不同,執行shell有如下3中方式

9、:source shell腳本 #沒有啟動獨立進程exec shell腳本#覆蓋原來代碼空間shell腳本 #fork方式 獨立代碼空間 122.shell程序結構程序結構2.1.shell程序文件2.2.第一個shell2.3.shell腳本的執行2.4.shell基本語法要素2.4.指定執行shell類型2.5.注釋2.6.登錄初始化shell腳本132.1.shell程序文件程序文件shell程序文件就是一個文本文件。shell的擴展名可以沒有,也可以是任意擴展名shell程序文件執行前必須要賦予執行的權限。142.2.第一個第一個shell下面是一個簡單由linux命令組合而成的簡單腳

10、本(注意腳本文件的編碼)date;whoecho hello shell編程!152.3.shell腳本的執行腳本的執行確定權限選擇執行方式source方式 source shell腳本文件. shell腳本文件fork方式 (shell腳本)shell腳本 shell腳本; #注意兩邊必須有空格exec方式exec shell腳本162.4.shell基本語法要素基本語法要素2.4.1.word與name word:獨立的字符串序列 name:有_與字母開頭的特殊的word,通常成為標識字 空白:空格鍵與tab鍵 元字符:| & ; ( ) space tab 控制字符:| &

11、; & ; ; ( ) | 保留字:! case do done elif else esac fi for function if in select then until while time 2.4.2.語句由word,name,空白,元字符,保留字構成語句。語句結束通常使用“;”或者“回車”表示,也可以使用|,&等表示注釋語句 #注釋指定shell類型:#!/bin/bash172.4.3.塊多個語句構成塊。shell腳本中塊的種類有很多,常見的塊有if塊,case塊,for塊,while塊,until塊,do塊,select塊等,函數塊。182.4.4.命令語句舉例:

12、.簡單語句: find . -type f find . -type f 2/dev/null find . -type f & .管道連接的語句: find . -type f | grep “tmp”.多語句行 ls | cat ls & date | pwd ls;date ! ls.復雜語句(ls;date;pwd) ls;date;pwd #注意兩邊的空格注意:;可以使用newline替換.其他語句算術表達式語句 (表達式)邏輯測試表達式語句 邏輯表達式202.5.指定執行指定執行shell類型

13、類型#!/bin/bashshell程序 shell腳本213.變量變量3.1.定義變量與declare3.2.使用變量3.3.常量或只讀變量3.4.文件名替換3.5.變量替換3.6.命令替換3.7.結構替換3.8.轉義字符 3.9.刪除變量3.10.環境變量 3.11.特殊變量與命令行參數3.12.選項解析3.13.數組變量223.1.定義變量與定義變量與declare3.1.1.定義.變量名=字面值例子:var=hello shell編程.declare 選項 變量名=字面值 變量名=字面值;例子:declare i a=20 b=30.types

14、et 選項 變量名=字面值 變量名=字面值;例子:typeset i b=30233.1.2.declare/typeset的選項-affirtx -p-p 顯示變量屬性與值-f 顯示函數名及其屬性 -f 顯示函數定義-a 定義數組變量-r 定義只讀變量-t 對變量或者函數實現跟蹤,對變量沒有特殊意義-x 導出變量到外部環境-i 定義整型變量 3.1.3.使用+關閉選項例子:declare +i a=23;243.1.4.變量命名規則組成:字母,數字,下劃線特別注意:只能字母,下劃線作為開頭字符變量;3.1.5.變量類型字符型整數型3.1.6.歧義字面值當字面值產生歧義,使用” ”或者界定“”

15、 與有區別 253.2.使用變量使用變量3.2.1.使用變量$變量echo $a$b$變量 在不產生歧義的情況下使用echo $a$b263.2.2.變量的作用范圍:系統級別:對所有用戶有效用戶級別:對當前用戶有效腳本級別:在當前腳本內有效局部級別:對當前塊有效 3.2.3.聲明子腳本可以使用的變量declare x 變量export 變量273.3.常量或只讀變量常量或只讀變量declare r 變量readonly 變量283.4.文件名替換文件名替換在變量值中有一些特殊的替換字符。這些字符在運行的時候會被替換成他表示的真正的值。文件名替換,只能使用在表示文件操作的指令之中。* 通配任意字

16、符長度的文件 ? 通配文件一個字符 通配文件中指定范圍內的字符- 在中使用表示范圍 在中使用表示否定 293.5.變量替換變量替換$parameter:-wordparameter為空或者沒有定義,則使用word替換parameter,但parameter變量不改變$parameter:=wordparameter為空或者沒有定義,則使用word替換parameter, parameter變量的值改變為word$parameter:?messageparameter為空或者沒有定義,則顯示message到錯誤輸出$parameter:+wordparameter有值或者已經定義,則使用word

17、替換,但parameter變量不改變。30$!prefix* 與 $!prefix得到以prefix開頭的變量名313.6.命令替換命令替換使用 做為界定符號,會把 中的字符做為命令執行,并把執行結果做為變量替換。也可以使用$(命令)例子:date +%d323.7.結構替換結構替換在shell中還有一個比較特殊的表達式替換$( 表達式 )注意(后與)前的空格結構替換中表達式支持的運算符號有:算術運算:+ - * / % * + -關系運算: = = !=邏輯運算:& | ! 位運算:& | 復合運算:+= -= *= /= %= = &= |= = 三目運算:expr

18、?expr1:expr2其他() expr,expr其中不支持小數運算。33表達式中支持變量的使用。例子:a=10b=20c=$( a+b )343.8.轉義字符轉義字符 在shell中有些字符容易產生歧義,需要做特殊處理,這就是轉義。shell中處理轉義的字符有三個: 對字符特殊轉義 對字符串轉義“ ” 對字符串轉義$35需要使用轉義的元字符* ? “ $ ; & ( ) | 換行 空格 制表符如果后面沒有元字符,則被忽略36 ,” ”符號界定的字符自動做為原義處理,不需要轉義。但 與 “本身卻需要轉義,同時其他轉義無效 , “ ”的區別:“ ”中間識別$ 與 符號對*替換符號 “

19、都有意義。37$支持的轉義符號a alert (bell)b backspacee an escape characterf form feedn new liner carriage returnt horizontal tabv vertical tab backslash single quotennn 8進制xhh 16進制383.9.刪除變量刪除變量unset 變量名unset語法:unset -vf 名字-v刪除變量-f刪除函數 393.10.環境變量環境變量 在shell中環境變量很多,一種是系統與用戶級別的環境變量,一種是shell級別環境變量使用env查看系統用戶環境變量,我

20、們需要理解的是path與ld_library_path兩個的作用使用set查看shell相關環境變量。40常見shell環境變量path環境變量:執行文件搜索路徑。路徑使用:分隔。ps1與ps2環境變量:提示符號。lineno環境變量:shell腳本的代碼行數。bash_versinfo環境變量:shell的版本信息,是數組。bash_version環境變量:shell的版本。groups環境變量:用戶所在的組。hostname環境變量:主機名。oldpwd環境變量:老工作目錄。ostype環境變量:操作系統類型。pwd環境變量:當前工作路徑。seconds環境變量:shell執行的秒數。sh

21、lvl環境變量:shell的層數。home環境變量:用戶主目錄。shell環境變量:登錄shell類型。prompt_command環境變量:指令執行完畢后的提示指令。machtype環境變量:機器類型。41ps提示符號的使用,提示符號分多級,比如ps1,ps2,ps3例子:ps1=“uh:w”ps1=uw:hello42位置參數$1 $9 表示命令行參數或者函數參數 433.11.特殊變量與命令行參數特殊變量與命令行參數shell中特殊變量如下:$*:位置參數,從1開始。當擴展發生在雙引號時,它展開成一個單獨的詞,每個參數的值由 ifs 特殊變量的第一個字符分隔。 $:位置參數,從1開始。當

22、在雙引號里展開時,每個參數展開成獨立的詞。比如:$1表示第一個參數。$#:位置參數個數。$?:展開成最近執行的前臺管道程序的退出狀態。$-:一個連字符展開為當前選項標志內部命令集 或者那些shell自己的集(如-i)。 $:shell的進程id。$!:展開成最近在后臺(異步)執行的命令的進程id。$0:展開成shell或者shell腳本名。$_:下劃線變量在shell啟動時設置,包含shell的絕對文件名或者作為參數列表被執行的腳本。隨后,它展開為前一個命令擴展后的最后一個參數。它同樣設置 為每個執行程序的全路徑,放在那個命令的輸出環境中。當檢查郵件時,這個參數保存郵件文件的名字。 4412.

23、選項解析選項解析getopts 選項 變量選項表示以開頭的參數存放選項的變量選項不匹配,則存放一個問號到變量,并返回0,并輸出一個標準錯誤選項匹配,則存放選項到變量,并返回0沒有選項,或者沒有開頭的參數,則返回非0 4513.數組變量數組變量定義數組:語法一:arrayindexnr=value說明:indexnr 需要使用一個值為正數的數學表達式。語法二:declare -a arrayname說明:一個帶有索引值的聲明也是可以接受的,但是索引值將被忽略。語法三:array=(value1 value2 . valuen)46使用數組:語法:數組名索引說明:*,指向所有的數組內容。不指定下標

24、,則得到數組第一個元素。刪除數組與刪除變量一樣:unset 數組名47s數組操作:$!name 與 $!name*得到數組的下標索引48字符串操作$parameter:offset #取子串$parameter:offset:length #取子串$#parameter #取長度$parameter#word #取匹配以word開始后的字符串$parameter#word #取匹配以word開始后的字符串$parameter%word #取匹配以word結束前的字符串$parameter%word #取匹配以word結束前的字符串$parameter/pattern/string #查找并替換

25、第一個 $parameter/pattern/string #查找替換所有49輸入輸出輸入輸出(sh-f-004)1.echo輸出2.printf輸出3.重定向輸出4.重定向輸入5.read輸入6.管道輸入7.文件描述符號與重定向輸出501.echo輸出輸出 echo -nee 變量參數-n 輸出完畢不輸出不回車符號-e支持專門的轉義字符-e關閉轉義字符echo支持的轉義字符a alert (bell)b backspacec suppress trailing newlinee an escape characterf form feedn new liner carriage return

26、t horizontal tabv vertical tab backslash0nnn nnn xhh 51 echo支持ansi轉義碼格式:n;km 或者 nm使用ctrl+v+escn與k指定轉義碼,可以指定一個或者兩個,指定兩個使用”;”分開m是固定的后綴字符。指定一位數字表示字體樣式。比如1m表示粗體, 1;3m 表示粗斜體。指定兩位數字表示顏色,3開始的表示前景色,4表示背景色。比如31m 表示前景色是紅色, 31;42m 表示前景色是紅色,背景顏色是綠色。522.printf輸出輸出 printf -v var format arguments-v輸出到變量var,而不是標準輸出

27、設備。format格式%-n.mx :-對齊方式 n最小長度,m最大長度。x類型如下:s stringc characterd decimal (integer) numberx hexadecimal numbero octal numbere exponential floating-point numberf fixed floating-point numberg compact floating-point number533.重定向輸出重定向輸出輸出重定向語法:覆蓋輸出重定向:n|word追加輸出重定向:nword標準輸出與錯誤輸出:&word 或者 &word覆蓋

28、標準與錯誤輸出: &word注意:n是指描述符號0(輸入),1(輸出),2(錯誤)&word與&word等價于word 2&1&word等價于word 2&1| 與作用一樣,但在設置noclobber為on的時候照樣覆蓋注意多個重定向使用的時候順序也很重要,比如:ls dirlist 2&1與ls 2&1 dirlist意思就不一樣,前者等價于ls &dirlist,后者就是標注輸出,因為其中錯誤輸出到1的拷貝了。54shell選項設置:set 顯示環境變量set o 顯示bash的選項設置set -o 選項 打開選項se

29、t +o 選項 關閉選項影響輸出重定向的shell選項設置:noclobber選項55一個特殊的文件/dev/null 空文件如果不想輸出到終端,或者定向到文件,則可以定向到/dev/null設備。564.重定向輸入重定向輸入重定向輸入語法:n關于輸入輸出的幾個補充:cmd text從命令行讀取輸入,直到一個與text相同的行結束。除非使用引號把輸入括起來,此模式將對輸入內容進行shell變量替換。如果使用 - ,則會忽略接下來輸入行首的tab,結束行也可以是一堆tab再加上一個與text相同的內容,可以參考後面的例子cmd word把word(而不是文件word)和後面的換行作為輸入提供給c

30、md。cmd file以讀寫模式把文件file重定向到輸入,文件file不會被破壞。585.read輸入輸入語法: read -ers -u fd -t timeout -a aname -p prompt -n nchars -d delim name .參數: -r 表示return鍵結束,沒有-r參數,用表示續行符號 -e 表示使用vi編輯。 -s 表示不回顯 -u 從文件描述符號讀取 -t 輸入的時間過時設置 -a 輸入數組 -n 設置輸入結束標志字符 -d 輸入的數據的 分割字符。596.管道輸入管道輸入command1 | command2 | .607.文件描述符號與重定向輸出文

31、件描述符號與重定向輸出cmd &n 把輸出送到文件描述符ncmd m&n 把輸出到文件符m的信息重定向到文件描述符ncmd &- 關閉標準輸出cmd cmd mcmd 1.shell的運算方式2.expr及其支持的運算3.() 與$()及其支持的運算4.let及其支持的運算5.test與、及其支持的運算621.shell的運算方式的運算方式shell支持的運算有很多種方式: expr ( ) let test與,632.expr及其支持的運算及其支持的運算 expr的語法expr expression注意expr是內建函數,expr后面的表達式是expr的命令行參數,所

32、以需要注意:expr的表達式使用要注意使用空格分開.必須使用word值,而不是name變量,& , expr支持的算術表達式arg1 + arg2arg1 - arg2arg1 * arg2arg1 / arg2arg1 % arg2( expression ) #優先級64expr支持的關系表達式arg1 | arg2arg1 & arg2arg1 arg2arg1 = arg2arg1 arg265 expr支持的字符串表達式string : regexp #統計匹配字符個數match string regexp #與上面作用一樣substr string pos leng

33、thindex string chars #chars只能是字符,不匹配字符串length string+ token #把token引用成字符串,包括關鍵字66 expr字符串表達式舉例:c=helloexpr $c : .* #統計字符個數c=hello world this is a hello worldexpr $c : (hello) #返回匹配的字符expr $c : helloexpr substr $c 2 20expr index $c world #匹配w不是worldexpr length $cexpr + match673.() 與與$()及其支持的運算及其支持的運算

34、id+ id-+id -id- +! * / % + - left and right bitwise shifts= = != 68&|&|expr?expr:expr= *= /= %= += -= = &= = |=expr1 , expr2694.let及其支持的運算及其支持的運算let支持的運算與()一樣.705.test與與、及其支持的運算及其支持的運算文件測試-a filetrue if file exists.-b filetrue if file exists and is a block special file.-c filetrue if fil

35、e exists and is a character special file.-d filetrue if file exists and is a directory.-e filetrue if file exists.-f filetrue if file exists and is a regular file.71-g filetrue if file exists and is set-group-id.-h filetrue if file exists and is a symbolic link.-k filetrue if file exists and its sti

36、cky bit is set.-p filetrue if file exists and is a named pipe (fifo).-r filetrue if file exists and is readable.-s filetrue if file exists and has a size greater than zero.72-t fd true if file descriptor fd is open and refers to a terminal.-u filetrue if file exists and its set-user-id bit is set.-w filetrue if file exists and is writable.-x filetrue if file exists and is executable.-o filetrue if file exists and is owned by the effective user id.-g filetrue if file exists and is owned by the effective group id.73-l filetrue if file exists and is a symbolic link.-s filetru

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論