您好,登錄后才能下訂單哦!
這篇文章主要介紹了shell腳本相關問題有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
shell:解釋執行用戶輸入命令,逐行解釋,也可以批處理很多指令,可將這些指令全部編寫到一個腳本文件中,讓shell一次執行多條命令,常用的shell(bash,它承擔shell這個角色,為shell腳本解釋器,為一個可執行的二進制文件)
shell的執行過程:
用戶在命令行輸入命令后,一般情況下Shell會fork子進程并調用exec進行程序替換,讓它的孫進程執行該命令,但是Shell的內建命令例外,執行內建命令相當于調用Shell進程中的一個函數,并不創建新的進程。如cd、export、umask、exit等命令即是內建命令
具體步驟:
1.交互Shell(bash)fork/exec一個子Shell(sh)用于執行腳本,父進程bash等待子進程sh終止。
2.sh讀取腳本中的cd ..命令,調用相應的函數執行內建命令,改變當前工作目錄為上一級目錄。
3.sh讀取腳本中的ls命令,fork/exec這個程序,列出當前工作目錄下的文件,sh等待ls終止。
4.ls終止后,sh繼續執行,讀到腳本文件末尾,sh終止。
5.sh終止后,bash繼續執行,打印提示符等待用戶輸入。
eval:是在終端上鍵入的一條普通命令行。然而當在它前面放上eval時,其結果是shell在執行命令行之前掃描它兩次
用法:eval [參數] eval可讀取一連串的參數,然后再依參數本身的特性來執行。
參數:參數行之前掃描它兩次,再次運算求出參數的內容。
1.用于回顯簡單變量:
2.兩次掃描,用于復雜變量顯示,新建一個文本文件,顯示該文本文件內容
3.可獲取最后一個參數
4.用eval創建指針變量,也可以改變該指針所指空間的內容
eval:不能獲得函數處理結果 ,所有命令,函數的處理結果只能通過 ``來獲得。eval 嵌套無意義 ,在其他語言中可以通過 eval(eval("code")),來執行(執行動態生成的code的返回),而由于shell 中 eval 將后面的eval命令簡單當作命令字符串執行,失去了嵌套作用,嵌套被命令替換取代。
` `與$()的區別與聯系
1.在有些情況下它們的用法相同,但它們之間也有區別
如上例,顯示當前時間時它們所獲得的值是一樣的,但獲得當前目錄所在主目錄時,``將$的特殊意義轉換出來了,而使用$()時并未解釋出來,被\轉義成了一個普通字符
2.若給上例再加上一個/
$()被轉義成了一個字符串,并內解釋出內容
3.在test.sh腳本中編寫如下內容
如上,用反引號時,四個反斜杠被解釋成了一個,而用$()時被解釋成了兩個
4.使用多個反斜杠時
由上可得:反引號本身就對\進行了轉義,保留了其本身意思,如果想在反引號中起到\的特殊意義,必須使用兩個\表示,$()使用時與平時一樣 \=\
[測試命令與[[]]的區別與聯系
1.[是一個可執行程序
2.單括號TEST命令要對變量進行單詞分離,當變量值包含空白符時,要用引號將變量括起來;而雙括號的TEST命令不會對變量進行單詞分離
當要測試時,bash回應參數太多了,是因為單引號TEST命令對變量進行單詞分離了,結果也就變成了
[ hello world = "hello world" ],多了那個字符串hello,成了字符串world和字符串hello world之間的比較了。因此如果在單括號的TEST命令的變量含有空格,但它還得和字符串比較,那就必須給變量加個雙引號了,這時它就不會發生錯誤了。而在下面的雙括號的TEST命令不能對變量單詞進行分離
3.單括號的TEST命令不對SHELL元字符進行擴展的,而雙括號TEST命令則會對SHELL元字符進行擴展的了。
4.在雙括號的TEST命令中,如果一個字符串(不管含不含有空格)僅僅是在表達式作為一個普通字符串,而不是一個模式的一部分,則它也必須用引號括起來。如果一個字符串值(右邊那個的了)不加雙引號,那這個字符串就是模式來的,如果它里面有含有SHELL元字符,BASH會對它進行擴展。如果字符串加了雙引號,那它就是一個很普通的字符串的,即便字符串里面里面含有特殊字符,也就是當普通內容來處理。
5.[ express1 –a express2 ] 這是放在單括號的TEST命令的,因為單的不支持元字符擴展,因此就只能叫做表達式了,它們可以組合構成邏輯測試的
感謝你能夠認真閱讀完這篇文章,希望小編分享的“shell腳本相關問題有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。