亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

如何系統(tǒng)地學(xué)習(xí)Shell編程學(xué)習(xí)指南?

看了很多的Shell學(xué)習(xí)計(jì)劃,但是最后都沒有完成,下面說說我們馬哥Linux學(xué)習(xí)社群的一個(gè)人的經(jīng)歷。

引言:什么是Shell?

Linux的命令行接口歸結(jié)起來就是各種Shell,那么到底什么是Shell?
Shell,譯為外殼,是用戶直接連入計(jì)算機(jī)所使用的計(jì)算機(jī)程序,負(fù)責(zé)解析用戶提供的命令,如詞法分析、語法分析、句法分析。

1.Shell的分類

Linux 的命令 shell 是與操作系統(tǒng)相分離的一層。不同的 shell 環(huán)境影響您具備不同的功能,比如可編輯的命令行和歷史命令回查等。shell 還決定了腳本中函數(shù)的語法。
下面就列舉幾個(gè)常用的Shell:
1. ?bash
bash shell 是 Bourne shell 的一個(gè)免費(fèi)版本,它是最早的 Unix shell,包括許多附加的特點(diǎn)。Bash 有可編輯的命令行,可以回查歷史命令,支持 tab 鍵補(bǔ)齊以使用戶避免輸入長的文件名。
2. ?csh
C shell 使用的是“類C”語法,借鑒了 Bourne shell 的許多特點(diǎn),只是內(nèi)部 shell 命令集有所不同。
3. ?ksh
Korn shell 的語法與 Bourne shell 相同,同時(shí)具備了 C shell 的易用特點(diǎn)。許多安裝腳本都使用 ksh ,即使您不把它作為您的主 shell,您也應(yīng)該在系統(tǒng)中安裝它。
4. ?tcsh?
TC shell 是 C shell 的一個(gè)增強(qiáng)版本,與 C shell 完全兼容。
5. ?zsh
Z shell 是 Korn shell 的一個(gè)增強(qiáng)版本,具備 bash shell 的許多特色。
> 默認(rèn)的 shell 是每個(gè)用戶帳號(hào)的一個(gè)參數(shù)。Linux 中典型的默認(rèn) shell 是 /bin/bash,不過也可以用其他的 shell。每個(gè) shell 的 man 文檔實(shí)際上都非常好,都對(duì)各種 shell 及其使用進(jìn)行了詳細(xì)的說明。

一:起因

(0)也許由于一時(shí)的沖動(dòng)使得你開始關(guān)注并學(xué)習(xí)shell編程;亦許由于是“道聽途說”shell的威力很大;亦許由于shell編程的魅力;亦許由于作為一個(gè)coder的偏好;亦許……

(1)先來搞清楚為什么要學(xué)shell,學(xué)習(xí)要有目的性 ---- 簡單的說shell就是一個(gè)包含若干行Shell或者Linux命令的文件。對(duì)于一次編寫,多次使用的大量命令,就可以使用單獨(dú)的文件保存下來,以便日后使用。

shell簡單、靈活、高效,特別適合處理一些系統(tǒng)管理方面的小問題

shell可以實(shí)現(xiàn)自動(dòng)化管理,讓系統(tǒng)管理員的工作變得容易、簡單、高效

shell可以把一些經(jīng)常需要用的命令或者操作,以文件的形式存儲(chǔ)起來,每一次調(diào)用即可,不用重復(fù)的鍵入命令

shell腳本可移植性好,在unix/Linux系統(tǒng)中可靈活移植,幾乎不用任何設(shè)置就能正常運(yùn)行

shell腳本可輕松方便讀取和修改源代碼,不需要編譯 掌握shell可以幫你解決一些故障問題,比如腳本引起的故障問題

掌握shell是一個(gè)中級(jí)以上系統(tǒng)工程師必需要會(huì)的 掌握shell是你系統(tǒng)管理進(jìn)階的必經(jīng)之路

掌握shell是你面試更高級(jí)職位的一塊敲門磚

(2)那什么時(shí)候不使用Shell 腳本?

資源密集型的任務(wù),尤其在需要考慮效率時(shí)(比如排序,hash 等)

需要處理大任務(wù)的數(shù)學(xué)操作,尤其是浮點(diǎn)運(yùn)算,精確運(yùn)算,或者復(fù)雜的算術(shù)運(yùn)算(這種情況一般使用C++或FORTRAN 來處理)

有跨平臺(tái)移植需求(一般使用C 或Java) 復(fù)雜的應(yīng)用,在必須使用結(jié)構(gòu)化編程的時(shí)候(需要變量的類型檢查,函數(shù)原型,等等)

對(duì)于影響系統(tǒng)全局性的關(guān)鍵任務(wù)應(yīng)用。 對(duì)于安全有很高要求的任務(wù),比如你需要一個(gè)健壯的系統(tǒng)來防止入侵,破解,惡意破壞等等. 項(xiàng)目由連串的依賴的各個(gè)部分組成。

需要大規(guī)模的文件操作 或 需要多維數(shù)組的支持 需要數(shù)據(jù)結(jié)構(gòu)的支持,比如鏈表或數(shù)等數(shù)據(jù)結(jié)構(gòu)

需要產(chǎn)生或操作圖形化界面 GUI 需要直接操作系統(tǒng)硬件 需要 I/O 或socket 接口

需要使用庫或者遺留下來的老代碼的接口 私人的,閉源的應(yīng)用(shell 腳本把代碼就放在文本文件中,全世界都能看到)

如果你的應(yīng)用符合上邊的任意一條,那么就考慮一下更強(qiáng)大的語言吧--或許是Perl,Python,Ruby, 或者是更高層次的編譯語言比如C/C++,Java

二:知識(shí)點(diǎn)介紹

(1)從腳本編寫和執(zhí)行開始 —— 編寫用vim即可,保存為filename.sh文件即可;執(zhí)行前需要更改為可執(zhí)行文件或者sh filename.sh來執(zhí)行:

1)通常shell腳本以.sh為后綴。在編寫shell時(shí),第一行一定要指明系統(tǒng)需要哪種shell解釋用戶的shell程序,如:#!/bin/sh,#!/bin/bash,#!/bin/csh,,#!/bin/tcsh和,#!/bin/ksh等。下面的run.sh則指明使用bash執(zhí)行。 #!bin/bash ls -l 通常,shell腳本會(huì)以#!/bin/sh作為默認(rèn)的shell程序。執(zhí)行shell的方式有兩種:第一種是為shell腳本加上可執(zhí)行權(quán)限并執(zhí)行,第二種是通過sh命令執(zhí)行shell腳本,例如執(zhí)行當(dāng)前目錄下的run.sh腳本,命令如下: //為shell腳本直接加上可執(zhí)行權(quán)限并執(zhí)行 chmod 755 run.sh ./run.sh

2)//通過sh命令執(zhí)行shell腳本

sh run.sh 注意:那為何『 sh shell.sh 』也可以運(yùn)行呢? 這是因?yàn)?/bin/sh 其實(shí)就是 /bin/bash(連結(jié)檔),使用 sh shell.sh 亦即告訴系統(tǒng),我想要直接以 bash 的功能來運(yùn)行 shell.sh 這個(gè)文件內(nèi)的相關(guān)命令的意思,所以此時(shí)你的 shell.sh 只要有 r 的權(quán)限即可被運(yùn)行喔!而我們也可以利用 sh 的參數(shù),如 -n 及 -x 來檢查與追蹤 shell.sh 的語法是否正確呢 sh -x filename.sh 這會(huì)執(zhí)行腳本并顯示腳本中所有變量的取值,也可以使用參數(shù)-n,它并不執(zhí)行腳本,只是返回所有的語法錯(cuò)誤。 (2)下面我們從經(jīng)典的“hello world”入手,看一看最簡單的Shell腳本的模樣

sudo vim hello.sh:

#!/bin/sh #print hello world in the console window a="hello world" echo "Hi, ${a}s"

chmod 755 hello.sh 更改為可執(zhí)行文件 rwx(4,2,1)

sh hello.sh 或者 ./hello.sh
(3)shell里的特殊字符

和其他編程語言一樣,shell里也有特殊字符。常見的有美元符號(hào)($),反斜線(\)和引號(hào)。

1)美元符號(hào)

美元符號(hào)表示變量替換,即用其后面指定的變量的值來代替變量。反斜線“\”為轉(zhuǎn)義字符,轉(zhuǎn)義字符告訴shell不要對(duì)其后面的那個(gè)字符進(jìn)行特殊處理,只是當(dāng)做普通字符。

2)雙引號(hào)(")

由雙引號(hào)括起來的字符,除$,倒引號(hào)(`)和反斜線(\)仍保留其特殊功能外,其余字符均作為普通字符對(duì)待。 3)單引號(hào)(') 由單引號(hào)括起來的字符都作為普通字符出現(xiàn)。

4)倒引號(hào)(`) tab鍵上面那個(gè)原始字符

由倒引號(hào)括起來的字符串被shell解釋為命令行,在執(zhí)行時(shí),shell會(huì)先執(zhí)行該命令,并以它的標(biāo)準(zhǔn)輸出結(jié)果取代整個(gè)引號(hào)部分。

5)示例

示例1的代碼及輸出如下: #echo "My current directory is `pwd` and logname is $LOGNAME"【雙引號(hào)中的倒引號(hào)和美元符號(hào)保持原來的功能】 My current directory is /root and logname is root 示例2的代碼及輸出如下: #echo "My current directory is `pwd` and logname is \$LOGNAME"【雙引號(hào)中的轉(zhuǎn)義字符保持原來的功能】 My current directory is /root and logname is $LOGNAME 示例3的代碼及輸出如下: #echo 'My current directory is `pwd` and logname is $LOGNAME'【單引號(hào)里面的內(nèi)容不變】 My current directory is `pwd`and logname is $LOGNAME

6)變量

shell的變量非常類似于JS 和 Python,不用聲明;但是有一點(diǎn)需要注意,變量和等號(hào)(即等號(hào)前后無任何空格)如 num=10;但是if [ ${num} eq 10 ];then …… fi 這其中的空格必須得有的

(4)shell腳本的注釋

shell腳本和其它編程語言一樣,也擁有注釋。注釋方法為在注釋行前加#號(hào)。 例如以下腳本: #!/bin/sh #Filename: comment.sh #Description:this script explains how to make a comment echo “This script explains how to make a comment ”

創(chuàng)建腳本時(shí),腳本的第一行通常稱為shbang(#!)行。當(dāng)腳本啟動(dòng)后,UNIX內(nèi)核檢查文件的第一行以決定將要執(zhí)行的程序類型。

shbang符號(hào)(#!)后面的路徑是用來解釋此腳本的shell位置。要正確使用這個(gè)特性,#!必須是文件中最前面的兩個(gè)字符。如果 文件頭部有空格字符或者空白行,則此特性被忽略,該行被解釋為普通的注釋行。

(5)再看sh腳本執(zhí)行的奧秘

打開文本編輯器,新建一個(gè)文件,擴(kuò)展名為sh(sh代表shell),擴(kuò)展名并不影響腳本執(zhí)行,見名知意就好,如果你用php寫shell 腳本,擴(kuò)展名就用php好了。
輸入一些代碼:
#!/bin/bash
echo "Hello World !"
“#!” 是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來執(zhí)行,即使用哪一種Shell。echo命令(最好用$printf ""具有更好的可移植性)用于向窗口輸出文本。
將上面的代碼保存為test.sh,并 cd 到相應(yīng)目錄:

chmod +x ./test.sh #使腳本具有執(zhí)行權(quán)限
./test.sh #執(zhí)行腳本

注意,一定要寫成./test.sh,而不是test.sh。運(yùn)行其它二進(jìn)制的程序也一樣,直接寫test.sh,Linux系統(tǒng)會(huì)去PATH里尋找有沒有叫test.
sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的當(dāng)前目錄通常不在PATH里,所以寫成test.sh是會(huì)找不到命令的,要用./test.sh告訴系統(tǒng)說,就在當(dāng)前目錄找。
通過這種方式運(yùn)行bash腳本,第一行一定要寫對(duì),好讓系統(tǒng)查找到正確的解釋器。
這里的"系統(tǒng)",其實(shí)就是shell這個(gè)應(yīng)用程序(想象一下Windows Explorer),但我故意寫成系統(tǒng),是方便理解,既然這個(gè)系統(tǒng)就是指shell,那么一個(gè)使用/bin/sh作為解釋器的腳本是不是可以省去第一行呢?是的。

三:體會(huì)心得

(1)簡單的說shell就是一個(gè)包含若干行Shell或者Linux命令的文件。對(duì)于一次編寫,多次使用的大量命令,就可以使用單獨(dú)的文件保存下來,以便日后使用。
例如:你用c編寫一個(gè)工程,里面有很多.h文件,.c文件等等,每一次更改你都得需要重新 g++ filenames.c filenames.h -o filenames,過于麻煩,這時(shí)就需要編寫一個(gè)小小shell文件,就可以解決問題了。

(2)記得自己上次寫Python的基礎(chǔ)學(xué)習(xí),應(yīng)該是一個(gè)月前了,這次重新學(xué)一個(gè)新的語言(腳本語言),間隔的時(shí)間非常短;越發(fā)的感覺,必須掌握精通一門語言,之后學(xué)習(xí)其他語言非常容易上手 —— 僅僅是入門,如果想在某一門語言上進(jìn)階或者深入,只能說“路漫漫其修遠(yuǎn)兮亦”!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!