溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

shell腳本相關(guān)問題有哪些

發(fā)布時(shí)間:2021-10-21 14:10:53 來源:億速云 閱讀:149 作者:小新 欄目:編程語言

這篇文章主要介紹了shell腳本相關(guān)問題有哪些,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

shell:解釋執(zhí)行用戶輸入命令,逐行解釋,也可以批處理很多指令,可將這些指令全部編寫到一個(gè)腳本文件中,讓shell一次執(zhí)行多條命令,常用的shell(bash,它承擔(dān)shell這個(gè)角色,為shell腳本解釋器,為一個(gè)可執(zhí)行的二進(jìn)制文件)

shell的執(zhí)行過程:

用戶在命令行輸入命令后,一般情況下Shell會fork子進(jìn)程并調(diào)用exec進(jìn)行程序替換,讓它的孫進(jìn)程執(zhí)行該命令,但是Shell的內(nèi)建命令例外,執(zhí)行內(nèi)建命令相當(dāng)于調(diào)用Shell進(jìn)程中的一個(gè)函數(shù),并不創(chuàng)建新的進(jìn)程。如cd、export、umask、exit等命令即是內(nèi)建命令

具體步驟:

1.交互Shell(bash)fork/exec一個(gè)子Shell(sh)用于執(zhí)行腳本,父進(jìn)程bash等待子進(jìn)程sh終止。

2.sh讀取腳本中的cd ..命令,調(diào)用相應(yīng)的函數(shù)執(zhí)行內(nèi)建命令,改變當(dāng)前工作目錄為上一級目錄。

3.sh讀取腳本中的ls命令,fork/exec這個(gè)程序,列出當(dāng)前工作目錄下的文件,sh等待ls終止。

4.ls終止后,sh繼續(xù)執(zhí)行,讀到腳本文件末尾,sh終止。

5.sh終止后,bash繼續(xù)執(zhí)行,打印提示符等待用戶輸入。

eval:是在終端上鍵入的一條普通命令行。然而當(dāng)在它前面放上eval時(shí),其結(jié)果是shell在執(zhí)行命令行之前掃描它兩次

用法:eval [參數(shù)]    eval可讀取一連串的參數(shù),然后再依參數(shù)本身的特性來執(zhí)行。
參數(shù):參數(shù)行之前掃描它兩次,再次運(yùn)算求出參數(shù)的內(nèi)容。

1.用于回顯簡單變量:

shell腳本相關(guān)問題有哪些

2.兩次掃描,用于復(fù)雜變量顯示,新建一個(gè)文本文件,顯示該文本文件內(nèi)容

shell腳本相關(guān)問題有哪些

3.可獲取最后一個(gè)參數(shù)

shell腳本相關(guān)問題有哪些

4.用eval創(chuàng)建指針變量,也可以改變該指針?biāo)缚臻g的內(nèi)容

shell腳本相關(guān)問題有哪些

eval:不能獲得函數(shù)處理結(jié)果 ,所有命令,函數(shù)的處理結(jié)果只能通過 ``來獲得。eval 嵌套無意義 ,在其他語言中可以通過 eval(eval("code")),來執(zhí)行(執(zhí)行動態(tài)生成的code的返回),而由于shell 中 eval 將后面的eval命令簡單當(dāng)作命令字符串執(zhí)行,失去了嵌套作用,嵌套被命令替換取代。

` `與$()的區(qū)別與聯(lián)系

1.在有些情況下它們的用法相同,但它們之間也有區(qū)別

shell腳本相關(guān)問題有哪些

如上例,顯示當(dāng)前時(shí)間時(shí)它們所獲得的值是一樣的,但獲得當(dāng)前目錄所在主目錄時(shí),``將$的特殊意義轉(zhuǎn)換出來了,而使用$()時(shí)并未解釋出來,被\轉(zhuǎn)義成了一個(gè)普通字符

2.若給上例再加上一個(gè)/

shell腳本相關(guān)問題有哪些

$()被轉(zhuǎn)義成了一個(gè)字符串,并內(nèi)解釋出內(nèi)容

3.在test.sh腳本中編寫如下內(nèi)容

shell腳本相關(guān)問題有哪些

如上,用反引號時(shí),四個(gè)反斜杠被解釋成了一個(gè),而用$()時(shí)被解釋成了兩個(gè)

4.使用多個(gè)反斜杠時(shí)

shell腳本相關(guān)問題有哪些

由上可得:反引號本身就對\進(jìn)行了轉(zhuǎn)義,保留了其本身意思,如果想在反引號中起到\的特殊意義,必須使用兩個(gè)\表示,$()使用時(shí)與平時(shí)一樣 \=\

[測試命令與[[]]的區(qū)別與聯(lián)系

1.[是一個(gè)可執(zhí)行程序

shell腳本相關(guān)問題有哪些

2.單括號TEST命令要對變量進(jìn)行單詞分離,當(dāng)變量值包含空白符時(shí),要用引號將變量括起來;而雙括號的TEST命令不會對變量進(jìn)行單詞分離

當(dāng)要測試時(shí),bash回應(yīng)參數(shù)太多了,是因?yàn)閱我朤EST命令對變量進(jìn)行單詞分離了,結(jié)果也就變成了

[ hello world = "hello world" ],多了那個(gè)字符串hello,成了字符串world和字符串hello world之間的比較了。因此如果在單括號的TEST命令的變量含有空格,但它還得和字符串比較,那就必須給變量加個(gè)雙引號了,這時(shí)它就不會發(fā)生錯(cuò)誤了。而在下面的雙括號的TEST命令不能對變量單詞進(jìn)行分離

shell腳本相關(guān)問題有哪些

3.單括號的TEST命令不對SHELL元字符進(jìn)行擴(kuò)展的,而雙括號TEST命令則會對SHELL元字符進(jìn)行擴(kuò)展的了。

4.在雙括號的TEST命令中,如果一個(gè)字符串(不管含不含有空格)僅僅是在表達(dá)式作為一個(gè)普通字符串,而不是一個(gè)模式的一部分,則它也必須用引號括起來。如果一個(gè)字符串值(右邊那個(gè)的了)不加雙引號,那這個(gè)字符串就是模式來的,如果它里面有含有SHELL元字符,BASH會對它進(jìn)行擴(kuò)展。如果字符串加了雙引號,那它就是一個(gè)很普通的字符串的,即便字符串里面里面含有特殊字符,也就是當(dāng)普通內(nèi)容來處理。

5.[ express1 –a express2 ] 這是放在單括號的TEST命令的,因?yàn)閱蔚牟恢С衷址麛U(kuò)展,因此就只能叫做表達(dá)式了,它們可以組合構(gòu)成邏輯測試的

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“shell腳本相關(guān)問題有哪些”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI