這篇文章主要為大家展示了“Shell怎么使用”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Shell怎么使用”這篇文章吧。
成都創(chuàng)新互聯(lián)始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)十多年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:隧道混凝土攪拌車等企業(yè),備受客戶表?yè)P(yáng)。
上圖是一個(gè)完整的、可執(zhí)行的 Linux Shell 程序,使用上述第一種方法運(yùn)行此程序,結(jié)果如下:
可以看出,當(dāng)前目錄并未被程序中的代碼改變。
當(dāng)命令行 shell 執(zhí)行程序時(shí),首先判斷程序是否具有執(zhí)行權(quán)限,然后調(diào)用 Linux 內(nèi)核命令新建(fork)一個(gè)進(jìn)程,在新建的進(jìn)程中調(diào)用指定的命令,如果程序文件是編譯型(為禁止文件),則 Linux 內(nèi)核知道如何執(zhí)行。但是,上圖中的 echo.sh 程序文件是文本文件,內(nèi)核不知道如何執(zhí)行。于是內(nèi)核返回“not executable format file”(不是可執(zhí)行的文件類型),當(dāng) shell 收到這個(gè)消息時(shí),則判定此文件是一個(gè)腳本。
當(dāng) shell 判定此文件為腳本后,啟動(dòng)一個(gè)新的 shell 執(zhí)行它。但是現(xiàn)在的 Linux 系統(tǒng)一般都有好幾個(gè) shell,通過(guò)腳本的第一行“#!”告訴運(yùn)行 shell 創(chuàng)建一個(gè)相應(yīng)的進(jìn)程來(lái)執(zhí)行腳本。
上圖就是運(yùn)行 shell 程序的第二種方法:調(diào)用命令解釋器執(zhí)行腳本。
上圖是運(yùn)行 shell 程序的第三種方法:直接使用 source 命令(也被稱為點(diǎn)命令)執(zhí)行腳本。
Linux Shell 可執(zhí)行的命令有三種:內(nèi)建命令、shell 函數(shù)和外部命令。
內(nèi)建命令就是 shell 程序本身包含的命令,這些命令集成在 shell 解釋器中,例如 cd、echo 等。在執(zhí)行內(nèi)建命令時(shí),沒有進(jìn)程的創(chuàng)建和消亡。
shell 函數(shù)是一系列程序代碼,以 shell 語(yǔ)言寫成,可以像其他命令一樣被引用。
外部命令是獨(dú)立于 shell 的可執(zhí)行程序,例如 find、grep、echo.sh。命令行 shell 在執(zhí)行外部命令時(shí),會(huì)創(chuàng)建一個(gè)當(dāng)前 shell 的復(fù)制進(jìn)程來(lái)執(zhí)行,因此存在進(jìn)程的創(chuàng)建和消亡。執(zhí)行過(guò)程如下:
子進(jìn)程在創(chuàng)建初期和父進(jìn)程一模一樣,但是它不能改變父進(jìn)程的參數(shù)變量。只有內(nèi)建命令才能改變環(huán)境變量。
通過(guò)上面的解釋,在使用前兩種方法執(zhí)行 shell 腳本時(shí),執(zhí)行過(guò)程如下:父進(jìn)程接收到命令“./echo.sh”或“/bin/bash echo.sh”時(shí),發(fā)現(xiàn)不是內(nèi)建命令,于是創(chuàng)建了一個(gè)和自己一模一樣的子進(jìn)程來(lái)執(zhí)行這個(gè)外部命令;子進(jìn)程用 /bin/sh 取代自己,sh 進(jìn)程設(shè)置自己的運(yùn)行環(huán)境變量;sh 進(jìn)程依次執(zhí)行內(nèi)建命令 cd 和 echo,環(huán)境變量被改變,但是父進(jìn)程的環(huán)境變量并沒有受到改變;sh 子進(jìn)程執(zhí)行完畢,消亡。父進(jìn)程從等待狀態(tài)醒來(lái)繼續(xù)接收命令。
而使用 source 命令執(zhí)行 shell 腳本時(shí),沒有子進(jìn)程的創(chuàng)建與消亡,而是直接在父進(jìn)程中執(zhí)行。
變量(variable)實(shí)際上是一個(gè)鍵值對(duì),例如 str="Hello",就是將字符串值(value)“Hello”賦予鍵(key)str。在 str 的使用范圍內(nèi),都可以使用 str 來(lái)引用“Hello”值,這個(gè)操作叫做變量替換。Shell 中的變量名稱以一個(gè)字母或下劃線開始,后面接任意長(zhǎng)度的字母、數(shù)字或下劃線。而且它對(duì)變量類型不做區(qū)分,一切值都是字符串,鍵值都沒有長(zhǎng)度的限制,但是在值為數(shù)字的時(shí)候,bash 是允許進(jìn)行比較操作和整數(shù)操作的。鍵值對(duì)賦值的時(shí)候,等號(hào)兩邊不能有任何的空格,想要使用變量名稱獲取值,需要使用 $ 符號(hào),當(dāng)賦值的內(nèi)容包含空格時(shí),需要加上引號(hào)。
需要注意的時(shí),使用 $ 符號(hào)獲取變量值的時(shí)候,只是 ${with_space} 的簡(jiǎn)寫形式,在某些上下文中,使用 $with_space 可能會(huì)引起錯(cuò)誤,這時(shí)就需要使用完全形式了。當(dāng)變量沒有 $ 前綴出現(xiàn)的時(shí)候,可能是如下幾種情況:變量被聲明或賦值、變量被 unset、變量被 export。
變量賦值可以使用等號(hào),也可以在 read 命令中或者循環(huán)頭進(jìn)行賦值,例如 for var in 1 2 3。被雙引號(hào)括起來(lái)的變量替換是不會(huì)被阻止的,因此它被稱為部分引用或弱引用,而使用單引號(hào)將會(huì)禁止變量替換,變量名只會(huì)被解釋成字面的意思,因此單引號(hào)被稱為全引用或強(qiáng)引用。在 shell 中,變量值可以是空值(NULL),這很常見且合理,但是在算術(shù)運(yùn)算中,空值變量往往被看作 0,不過(guò)這是一個(gè)為文檔化(同時(shí)可能是不可移植)的行為。
Linux Shell 中變量類型有兩種:局部變量可見范圍在代碼塊或函數(shù)中,并且必須明確以 local 聲明,否作它是全局可見的;全局變量(例如環(huán)境變量)可見范圍為全局,不需要加任何修飾詞。
上圖中執(zhí)行了一個(gè)變量相關(guān)的程序,運(yùn)行結(jié)果如下:變量 num 初始值為 123;調(diào)用 func1() 函數(shù)將它賦為 321,需要注意的是此處是修改了全局變量;調(diào)用 func2() 函數(shù)將它賦為 456,此處賦值加上了 local 聲明,因此修改的是局部變量。
echo 命令通常用來(lái)將各個(gè)參數(shù)打印到標(biāo)準(zhǔn)輸出。參數(shù)間以一個(gè)空格隔開,在輸出打印結(jié)束后,換行。下圖為它的轉(zhuǎn)義字符序列。
export 命令通常用來(lái)設(shè)置環(huán)境變量,但是這里設(shè)置的環(huán)境變量,僅僅作用于當(dāng)前進(jìn)程,進(jìn)程消亡之后就會(huì)消失;也就是說(shuō)子進(jìn)程用 export 命令設(shè)置的變量無(wú)法影響到父進(jìn)程。但是如果使用 source 方式調(diào)用腳本,腳本里有 export 命令修改了環(huán)境變量,則會(huì)影響到父進(jìn)程。
env 命令不帶參數(shù)的情況下,顯示所有環(huán)境變量,-i 參數(shù)表示不帶環(huán)境變量,-u 參數(shù)表示從環(huán)境變量中刪除一個(gè)變量。(與 set 函數(shù)顯示所有本地變量不同,env 函數(shù)只顯示環(huán)境變量)
unset 命令默認(rèn)為刪除變量(-v 參數(shù)),如果使用 -f 參數(shù),則被視為刪除函數(shù)。
語(yǔ)言類型:計(jì)算機(jī)內(nèi)核(CPU)不能直接理解高級(jí)語(yǔ)言(Linux Shell、Java、Python 等),只能直接理解機(jī)器語(yǔ)言,所以必須把高級(jí)語(yǔ)言翻譯成機(jī)器語(yǔ)言,計(jì)算機(jī)才能執(zhí)行高級(jí)語(yǔ)言編寫的程序。
翻譯的方式有兩種:一個(gè)是編譯(compile),一個(gè)是解釋(interpret),這兩種方式只是翻譯的時(shí)間不同。編譯型語(yǔ)言在執(zhí)行程序之前,需要一個(gè)專門的編譯過(guò)程,把程序編譯成機(jī)器語(yǔ)言的文件,在之后的運(yùn)行中,就不用重新翻譯了。解釋性語(yǔ)言不需要編譯,只是在程序運(yùn)行的同時(shí)進(jìn)行翻譯,通常會(huì)有一個(gè)專門的解釋器(
例如 Linux Shell 中的
/bin/sh、bash、zsh、csh 等)。
兩種類型的語(yǔ)言,差異如下:許多中、大型程序都是用編譯型語(yǔ)言(例如 C/C++、Java、Fortran)完成,它們的源代碼文件(source code)經(jīng)過(guò)編譯之后轉(zhuǎn)為目標(biāo)代碼文件(object code),機(jī)器才能讀取并執(zhí)行目標(biāo)代碼文件;編譯型語(yǔ)言高效,但是由于貼近于機(jī)器底層,難以執(zhí)行上層的一些簡(jiǎn)單操作(例如 C++ 難以對(duì)某目錄下的所有文件批量重命名),而解釋型語(yǔ)言執(zhí)行層面高于編譯型語(yǔ)言,因此能輕松完成一些高級(jí)操作;腳本語(yǔ)言(Shell、Perl、Python、awk、Ruby 等)都是解釋性語(yǔ)言。
(Python 是一種解釋型語(yǔ)言,但是它采用了 Java 語(yǔ)言的 VM 機(jī)制,提供了編譯功能,它的源代碼文件經(jīng)過(guò)編譯后,產(chǎn)生了字節(jié)碼文件(bytecode),可以節(jié)省加載模塊的時(shí)間從而提高效率)
以上是“Shell怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!