shell初涉
一.概念:
Shell俗稱殼(用來區別于核),是一個命令行解釋器,它接收用戶命令,然后調用相應的應用程序。
二.shell的種類:
1.???? sh(Bourne Shell):由Steve Bourne開發,各種UNIX系統都配有sh
2.?? ? csh(C Shell):由Bill Joy開發,隨BSD UNIX發布,它的流程控制語句很像C語言,支持很多Bourne Shell所不支持的功能:作業控制,命令歷史,命令行編輯。
3.?? ? ksh(Korn Shell):由David Korn開發,向后兼容sh的功能,并且添加了csh引入的新功能, 是目前很多UNIX系統標準配置的Shell,在這些系統上/bin/sh往往是指向/bin/ksh的符號鏈 接。
4.?? ? tcsh(TENEX C Shell):是csh的增強版本,引入了命令補全等功能,在FreeBSD、Mac OS X等系統上替代了csh。
5.?? ? bash(Bourne Again Shell):由GNU開發的Shell,主要目標是與POSIX標準保持一致,同 時兼顧對sh的兼容,bash從csh和ksh借鑒了很多功能,是各種Linux發行版標準配置的Shell,在Linux系統上/bin/sh往往是指向/bin/bash的符號鏈接。雖然如此,bash和sh還是有很多 不同的,一方面,bash擴展了一些命令和參數,另一方面,bash并不完全和sh兼容,有些行 為并不一致,所以bash需要模擬sh的行為:當我們通過sh這個程序名啟動bash時,bash可以 假裝自己是sh,不認擴展的命令,并且行為與sh保持一致。
三.shell的運行過程:
linux環境下,打開電腦,電腦就會運行bash。當我們進入終端時,bash會在當前目錄下創建一個子
shell(為了防止惡意命令使bash出錯)。當我們輸入命令時,子shell會先檢測是否為內置命令,如果是,則直接執行,如果不是內置命令,而是普通命令時,子shell會創建一個子進程,在子進程中exec
這個命令的二進制文件(但如果要執行的不是二進制文件,而是文本文件,并且第一行用Shebang(#! /bin/sh)指定了解釋器,則子進程中exec解釋器程序的代碼,并且從解釋器的_start開始執行,而這個文本文件被當作命令行參數傳給解釋器)。
PS:shell內置命令只是shell進程中的一個函數。Shell的內建命令用man bash-builtins命令查看。
四.shell變量:
(1).概述:,Shell變量由全大寫字母加下劃線組成,shell變量分為環境變量和本地變量。
環境變量:環境變量可以從父進程傳給子進程。可以用printenv命令顯示當前shell的環境變量。
本地變量:只存在于當前shell進程。可以用set命令顯示當前shell進程中定義的所有變量和函數。
PS:環境變量是所有進程都有的,而本地變量是shell特有的。
???????? 導出環境變量用的是export命令。(exprot VARNAME=value)(導出環境變量和定義環境變量可以一步完成)。
????????? 用unset命令刪除已定義的環境變量或本地變量。
(2).變量引用:
如果一個變量叫做VARNAME,用${VARNAME}可以表示它的值,在不引起歧義的情況下也可用$VARNAME表示它的值。
如??? echo ${VALNAME}
(3).文件名替換:
以下用于匹配的字符稱為通配符(Wildcard),具體如下:
* : 匹配0個或多個任意字符
? : 匹配一個任意字符
[若干字符] : 匹配方括號中任意一個字符的一次出現
例如:有bash.c??? bbsh.c?? bcsh.c???? bdsh.c文件
則執行??? ls????? *.c ?????????????????????? 會顯示所有.c文件
??????????????? ls????? b?sh.c???????????????? 會顯示上面的所有文件
??????????????? ls????? b[abc]sh.c????????? 會顯示bash.c??? bbsh.c????? bcsh.c文件
(4).命令行替換:
`命令`?? 或?? $( 命令)??????????? (注:``為反引號,與~放在一起)
Shell先執行該命令,然后將輸出結果立刻代換到當前命令行中。
例如:value=`data`
(5).算數替換:
$((? 算數運算? ))????? 用于算術計算,$((?? ))中的Shell變量取值將轉換成整數
val=10 echo?$((?$val?+?3?))注:注意空格,命令之間要有空格。
常見的運算符:+,- ,*,? / ,% ,**(冪)
算數運算還可以用let等命令:如??? let?? val=$val+3
(6).轉義字符:
和C語言類似,\?? 在Shell中被用作轉義字符。
例如:創建一個 test c.c文件(test與c中間有空格)
touch?test\?\c.c還有一個比較特殊的符號,即? -?? ,但想創建一個以-開頭的文件時,shell解釋器會把? -? 當作選項提示符,此時即使用? \?? 轉義也是不行的,因為它還是代表?? -?? 的字面意思。所以可以用下面的方法:
touch?./-test.c./表示當前工作目錄
(7).單引號與雙引號:
和C語言不一樣,Shell腳本中的單引號和雙引號一樣都是字符串的界定符,而不是字符的界定符。單引號用于保持引號內所有字符的字面值,即使引號內的\和回車也不例外, 但是字符串中不能出現單引號。
雙引號與單引號一樣,只是有一下幾種情況例外:
$ 加變量名可以取變量的值\$表示示$的字面面值
\`表示示`的字面面值
\"表示示"的字面面值
\\表示示\的字面面值 除以上情況之外u反引號仍表示命令替換
\可以起轉移字符的作用
五.條件測試與循環語句:
(1).??? test? 命令?? 或????? [? 命令 ]???
命令test或 [ 可以測試一個條件是否成立,如果測試結果為真,則該命令的Exit Status為0,如果測試結果為假,則命令的Exit Status為1(注意與C語言的邏輯表示正好相反)。
[ -d DIR ] : 如果DIR存在并且是一個目錄則為真
[ -f FILE ] : 如果FILE存在且是一個普通文件則為真
[ -z STRING ] : 如果STRING的長度為零則為真
[ -n STRING ] : 如果STRING的長度非非零則為真
[ STRING1 = STRING2 ] : 如果兩個字符串相同則為真
[ STRING1 != STRING2 ] : 如果字符串不相同則為真
[ ARG1 OP ARG2 ] : ARG1和ARG2應該是整數或者取值為整數的變量,OP是-eq(等于)- ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等 于)之中的一個
[ ! EXPR ] : EXPR可以是上面中的任意一種測試條件,? !表示示邏輯反
[ EXPR1 -a EXPR2 ] : EXPR1和EXPR2可以是上面中的任意一種測試條件,-a表示示邏輯 與
[ EXPR1 -o EXPR2 ] :EXPR1和EXPR2可以是上面中的任意一種測試條件,-o表示示邏輯 或
(2).? if條件判斷:
格式為:
if?命令;then命令 elif?命令;then命令 else命令 fiPS:? if和then為兩條命令,放在同一行要以 ; 分開,then后面shell會自動續行,把下一條命令放在then后面當作一條命令,由于shell中沒有和c語言一樣的{ }(除函數一樣外),所以要用fi表示if結束。
:?? 是一個特殊的命令,稱為空命令,該命令不做任何事,但Exit Status總是真
如:
if?:?;thenecho?'hello'另外,Shell還提供了 && 和 ||? 語法,和C語言類似,所以if 語句也可以這樣寫:
index=0 [?index?-le?10?]?&&?{echo?'hello'let?index++ }index=0 [?index?-ge?10?]?||?{echo?'hello'let?index++ }這兩個判斷效果是一樣的,都是打印11次hello
PS:-a?? 與-o?? 是測試兩個條件然后形成一個結果的,而&& 與? ||? 則是測試兩條命令的,兩邊都是一個獨立的結果。
(3).case與esac
格式為:
case?條件?in結果1)命令;;結果2)命令;; esac因為shell是弱類型的,并且值是以字符串形式存儲的,所以結果1/結果2等可以是字符串,通配符,字符等(c語言中只能匹配整數或字符常量),另外,每個匹配分支可以有若干 條命令,末尾必須以? ;;?? 結束,執行時找到第一個匹配的分支并執行相應的命令,然后直接跳 到esac之后,不需要像C語言一樣用break跳出。
如:
read?val case?$val?ina)echo?'this?is?a';;b)echo?'this?is?b';;*)echo?'all?is?right';; esac(4).
轉載于:https://blog.51cto.com/10704527/1789659
總結
- 上一篇: springMVC纯java代码配置(一
- 下一篇: 人生第一次删好友,删的就是你!连路飞都怒