shell腳本就是一些命令的集合。
為余干等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及余干網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、成都網(wǎng)站制作、余干網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
舉個(gè)例子,我想實(shí)現(xiàn)這樣的操作:
1)進(jìn)入到/tmp/目錄;
2)列出當(dāng)前目錄中所有的文件名;
3)把所有當(dāng)前的文件拷貝到/root/目錄下;
4)刪除當(dāng)前目錄下所有的文件。
簡(jiǎn)單的4步在shell窗口中需要你敲4次命令,按4次回車(chē)。這樣是不是很麻煩?當(dāng)然這4步操作非常簡(jiǎn)單,如果是更加復(fù)雜的命令設(shè)置需要幾十次操作呢?那樣的話(huà)一次一次敲鍵盤(pán)會(huì)很麻煩。所以不妨把所有的操作都記錄到一個(gè)文檔中,然后去調(diào)用文檔中的命令,這樣一步操作就可以完成。其實(shí)這個(gè)文檔呢就是shell腳本了,只是這個(gè)shell腳本有它特殊的格式?!秎inux 就該這么學(xué)》
Shell腳本通常都是以.sh 為后綴名的,這個(gè)并不是說(shuō)不帶.sh這個(gè)腳本就不能執(zhí)行,只是大家的一個(gè)習(xí)慣而已。所以,以后你發(fā)現(xiàn)了.sh為后綴的文件那么它一定會(huì)是一個(gè)shell腳本了。test.sh中第一行一定是 “#! /bin/bash” 它代表的意思是,該文件使用的是bash語(yǔ)法。如果不設(shè)置該行,那么你的shell腳本就不能被執(zhí)行?!?’表示注釋?zhuān)谇懊嬷v過(guò)的。后面跟一些該腳本的相關(guān)注釋內(nèi)容以及作者和創(chuàng)建日期或者版本等等。當(dāng)然這些注釋并非必須的,如果你懶的很,可以省略掉,但是筆者不建議省略。因?yàn)殡S著你工作時(shí)間的增加,你寫(xiě)的shell腳本也會(huì)越來(lái)越多,如果有一天你回頭查看你寫(xiě)的某個(gè)腳本時(shí),很有可能忘記該腳本是用來(lái)干什么的以及什么時(shí)候?qū)懙摹K詫?xiě)上注釋是有必要的。另外系統(tǒng)管理員并非你一個(gè),如果是其他管理員查看你的腳本,他看不懂豈不是很郁悶。該腳本再往下面則為要運(yùn)行的命令了。
在Linux下,如果你需要執(zhí)行shell腳本,那么應(yīng)該使用那個(gè)命令呢?下面由我為大家整理了linux shell腳本執(zhí)行命令的相關(guān)知識(shí),希望對(duì)大家有幫助!
linux shell腳本執(zhí)行
linux shell腳本執(zhí)行方法一: 切換到shell腳本所在的目錄(此時(shí),稱(chēng)為工作目錄)執(zhí)行shell腳本:
cd /data/shell
./hello.sh
./的意思是說(shuō)在當(dāng)前的工作目錄下執(zhí)行hello.sh。如果不加上./,bash可能會(huì)響應(yīng)找到不到hello.sh的錯(cuò)誤信息。因?yàn)槟壳暗墓ぷ髂夸?/data/shell)可能不在執(zhí)行程序默認(rèn)的搜索路徑之列,也就是說(shuō),不在環(huán)境變量PASH的內(nèi)容之中。查看PATH的內(nèi)容可用 echo $PASH 命令?,F(xiàn)在的/data/shell就不在環(huán)境變量PASH中的,所以必須加上./才可執(zhí)行。
linux shell腳本執(zhí)行方法二: 以絕對(duì)路徑的方式去執(zhí)行bash shell腳本:
/data/shell/hello.sh
linux shell腳本執(zhí)行方法三: 直接使用bash 或sh 來(lái)執(zhí)行bash shell腳本:
cd /data/shell
bash hello.sh
或
cd /data/shell
sh hello.sh
注意,若是以方法三的方式來(lái)執(zhí)行,那么,可以不必事先設(shè)定shell的執(zhí)行權(quán)限,甚至都不用寫(xiě)shell文件中的第一行(指定bash路徑)。因?yàn)榉椒ㄈ菍ello.sh作為參數(shù)傳給sh(bash)命令來(lái)執(zhí)行的。這時(shí)不是hello.sh自己來(lái)執(zhí)行,而是被人家調(diào)用執(zhí)行,所以不要執(zhí)行權(quán)限。那么不用指定bash路徑自然也好理解了啊。
linux shell腳本執(zhí)行方法四: 在當(dāng)前的shell環(huán)境中執(zhí)行bash shell腳本:
cd /data/shell
. hello.sh
或
cd /data/shell
source hello.sh
前三種方法執(zhí)行shell腳本時(shí)都是在當(dāng)前shell(稱(chēng)為父shell)開(kāi)啟一個(gè)子shell環(huán)境,此shell腳本就在這個(gè)子shell環(huán)境中執(zhí)行。shell腳本執(zhí)行完后子shell環(huán)境隨即關(guān)閉,然后又回到父shell中。而方法四則是在當(dāng)前shell中執(zhí)行的。
實(shí)現(xiàn)的方法如下:
1、第一步,打開(kāi)命令控制臺(tái)以找到要編輯的文件,執(zhí)行命令ls來(lái)查看下面的一些文件,在下面有一個(gè)index.php文件,如下圖所示。
2、其次,完成上述步驟后,執(zhí)行命令vi
index.php,如下圖所示。
3、接著,完成上述步驟后,如果要修改此文件的內(nèi)容,請(qǐng)按鍵盤(pán)上的“
i”鍵,底部將變?yōu)镮NSERT,就可以對(duì)其進(jìn)行修改,如下圖所示。
4、然后,寫(xiě)echo的代碼保存?Esc+:+wq,這是保存,按Enter鍵保存,如下圖所示。
5、隨后,完成上述步驟后,再次打開(kāi)文件,將發(fā)現(xiàn)剛剛編寫(xiě)的代碼已保存在其中,如下圖所示。
6、最后,不保存命令是Esc+:+q!,可以靈活運(yùn)用這些命令??梢允褂蒙鲜霾襟E在Linux終端中使用命令來(lái)編輯和保存文件,如下圖所示。這樣,問(wèn)題就解決了。
#!/bin/bash
eval?"cd?/export/songhongwei/code"
eval?"cd?/export/songhongwei/data"
echo?"上面兩行就是在.shell書(shū)寫(xiě)linux命令的方式"
備注:
語(yǔ)法:eval?cmdLine
eval會(huì)對(duì)后面的cmdLine進(jìn)行兩遍掃描,如果第一遍掃描后,cmdLine是個(gè)普通命令,則執(zhí)行此命令;如果cmdLine中含有變量的間接引用,則保證間接引用的語(yǔ)義。
Shell?的?echo?指令與?PHP?的?echo?指令類(lèi)似,都是用于字符串的輸出。
IT路邊社
前言
與其它的編碼規(guī)范一樣,這里所討論的不僅僅是編碼格式美不美觀的問(wèn)題, 同時(shí)也討論一些約定及編碼標(biāo)準(zhǔn)。這份文檔主要側(cè)重于我們所普遍遵循的規(guī)則,對(duì)于那些不是明確強(qiáng)制要求的,我們盡量避免提供意見(jiàn)。
編碼規(guī)范對(duì)于程序員而言尤為重要,有以下幾個(gè)原因:
本文檔中的準(zhǔn)則致力于最大限度達(dá)到以下原則:
盡管本文檔涵蓋了許多基礎(chǔ)知識(shí),但應(yīng)注意的是,沒(méi)有編碼規(guī)范可以為我們回答所有問(wèn)題,開(kāi)發(fā)人員始終需要再編寫(xiě)完代碼后,對(duì)上述原則做出正確的判斷。
注 :未明確指明的則默認(rèn)為必須(Mandatory)
主要參考如下文檔:
僅建議Shell用作相對(duì)簡(jiǎn)單的實(shí)用工具或者包裝腳本。因此單個(gè)shell腳本內(nèi)容不宜太過(guò)復(fù)雜。
在選擇何時(shí)使用shell腳本時(shí)時(shí)應(yīng)遵循以下原則:
可執(zhí)行文件不建議有擴(kuò)展名,庫(kù)文件必須使用 .sh 作為擴(kuò)展名,且應(yīng)是不可執(zhí)行的。
執(zhí)行一個(gè)程序時(shí),無(wú)需知道其編寫(xiě)語(yǔ)言,且shell腳本并不要求具有擴(kuò)展名,所以更傾向可執(zhí)行文件沒(méi)有擴(kuò)展名。
而庫(kù)文件知道其編寫(xiě)語(yǔ)言十分重要,使用 .sh 作為特定語(yǔ)言后綴的擴(kuò)展名,可以和其他語(yǔ)言編寫(xiě)的庫(kù)文件加以區(qū)分。
文件名要求全部小寫(xiě), 可以包含下劃線(xiàn) _ 或連字符 - , 建議可執(zhí)行文件使用連字符,庫(kù)文件使用下劃線(xiàn)。
正例:
反例:
源文件編碼格式為UTF-8。避免不同操作系統(tǒng)對(duì)文件換行處理的方式不同,一律使用 LF 。
每行最多不超過(guò)120個(gè)字符。每行代碼最大長(zhǎng)度限制的根本原因是過(guò)長(zhǎng)的行會(huì)導(dǎo)致閱讀障礙,使得縮進(jìn)失效。
除了以下兩種情況例外:
如出現(xiàn)長(zhǎng)度必須超過(guò)120個(gè)字符的字符串,應(yīng)盡量使用here document或者嵌入的換行符等合適的方法使其變短。
示例:
除了在行結(jié)束使用換行符,空格是源文件中唯一允許出現(xiàn)的空白字符。
對(duì)從來(lái)沒(méi)有用到的或者被注釋的方法、變量等要堅(jiān)決從代碼中清理出去,避免過(guò)多垃圾造成干擾。
Bash 是唯一被允許使用的可執(zhí)行腳本shell。
可執(zhí)行文件必須以 #!/bin/bash 開(kāi)始。請(qǐng)使用 set 來(lái)設(shè)置shell的選項(xiàng),使得用 bash echo "Process $: Done making $$$."
# 示例7:命令參數(shù)及路徑不需要引號(hào) grep -li Hugo /dev/ "$1"
# 示例8:常規(guī)變量用雙引號(hào),ccs可能為空的特殊情況可不用引號(hào) git send-email --to "${reviewers}" ${ccs:+"--cc" "${ccs}"}
# 示例9:正則用單引號(hào),$1可能為空的特殊情況可不用引號(hào) grep -cP '([Ss]pecial||?characters*) ${1:+"$1"}
# 示例10:位置參數(shù)傳遞推薦帶引號(hào)的"$@",所有參數(shù)作為單字符串傳遞用帶引號(hào)的"$*" # content of t.sh func_t { echo num: $# echo args: 1:$1 2:$2 3:$3 }
func_t "$@" func_t "$*" # 當(dāng)執(zhí)行 ./t.sh a b c 時(shí)輸出如下: num: 3 args: 1:a 2:b 3:c num: 1 args: 1:a b c 2: 3:
使用 $(command) 而不是反引號(hào)。
因反引號(hào)如果要嵌套則要求用反斜杠轉(zhuǎn)義內(nèi)部的反引號(hào)。而 $(command) 形式的嵌套無(wú)需轉(zhuǎn)義,且可讀性更高。
正例:
反例:
條件測(cè)試
使用 [[ ... ]] ,而不是 [ , test , 和 /usr/bin/[ 。
因?yàn)樵? [[ 和 ]] 之間不會(huì)出現(xiàn)路徑擴(kuò)展或單詞切分,所以使用 [[ ... ]] 能夠減少犯錯(cuò)。且 [[ ... ]] 支持正則表達(dá)式匹配,而 [ ... ] 不支持。參考以下示例:
盡可能使用變量引用,而非字符串過(guò)濾。
Bash可以很好的處理空字符串測(cè)試,請(qǐng)使用空/非空字符串測(cè)試方法,而不是過(guò)濾字符,讓代碼具有更高的可讀性。正例:
反例:
正例:
反例:
正例:
反例:
文件名擴(kuò)展
當(dāng)進(jìn)行文件名的通配符擴(kuò)展時(shí),請(qǐng)指定明確的路徑。
當(dāng)目錄中有特殊文件名如以 - 開(kāi)頭的文件時(shí),使用帶路徑的擴(kuò)展通配符 ./* 比不帶路徑的 * 要安全很多。
應(yīng)該避免使用eval。
Eval在用于分配變量時(shí)會(huì)修改輸入內(nèi)容,但設(shè)置變量的同時(shí)并不能檢查這些變量是什么。反例:
請(qǐng)使用進(jìn)程替換或者for循環(huán),而不是通過(guò)管道連接while循環(huán)。
這是因?yàn)樵诠艿乐蟮膚hile循環(huán)中,命令是在一個(gè)子shell中運(yùn)行的,因此對(duì)變量的修改是不能傳遞給父shell的。
這種管道連接while循環(huán)中的隱式子shell使得bug定位非常困難。反例:
如果你確定輸入中不包含空格或者其他特殊符號(hào)(通常不是來(lái)自用戶(hù)輸入),則可以用for循環(huán)代替。例如:
使用進(jìn)程替換可實(shí)現(xiàn)重定向輸出,但是請(qǐng)將命令放入顯式子 shell,而非 while 循環(huán)創(chuàng)建的隱式子 shell。例如:
總是檢查返回值,且提供有用的返回值。
對(duì)于非管道命令,使用 $? 或直接通過(guò) if 語(yǔ)句來(lái)檢查以保持其簡(jiǎn)潔。
例如:
當(dāng)內(nèi)建命令可以完成相同的任務(wù)時(shí),在shell內(nèi)建命令和調(diào)用外部命令之間,應(yīng)盡量選擇內(nèi)建命令。
因內(nèi)建命令相比外部命令而言會(huì)產(chǎn)生更少的依賴(lài),且多數(shù)情況調(diào)用內(nèi)建命令比調(diào)用外部命令可以獲得更好的性能(通常外部命令會(huì)產(chǎn)生額外的進(jìn)程開(kāi)銷(xiāo))。
正例:
反例:
加載外部庫(kù)文件不建議用使用.,建議使用source,已提升可閱讀性。正例:
反例:
除非必要情況,盡量使用單個(gè)命令及其參數(shù)組合來(lái)完成一項(xiàng)任務(wù),而非多個(gè)命令加上管道的不必要組合。常見(jiàn)的不建議的用法例如:cat和grep連用過(guò)濾字符串; cat和wc連用統(tǒng)計(jì)行數(shù); grep和wc連用統(tǒng)計(jì)行數(shù)等。
正例:
除特殊情況外,幾乎所有函數(shù)都不應(yīng)該使用exit直接退出腳本,而應(yīng)該使用return進(jìn)行返回,以便后續(xù)邏輯中可以對(duì)錯(cuò)誤進(jìn)行處理。正例:
反例:
推薦以下工具幫助我們進(jìn)行代碼的規(guī)范:
原文鏈接:
獲取更多的面試題、腳本等運(yùn)維資料點(diǎn)擊: 運(yùn)維知識(shí)社區(qū) 獲取
腳本之---短信轟炸機(jī)
腳本之---QQ微信轟炸機(jī)
ansible---一鍵搭建redis5.0.5集群
elk7.9真集群docker部署文檔
全球最全loki部署及配置文檔
最強(qiáng)安全加固腳本2.0
一鍵設(shè)置iptbales腳本
新建一個(gè)文件shell腳本一般用×.sh作為后綴當(dāng)然勇氣他的也可以。打開(kāi)終端輸入touch first.sh 新建一個(gè)名為first的shell腳本。
編寫(xiě)一個(gè)簡(jiǎn)單的linuxshell腳本
使用vim 編輯first.sh也可以用其他的文本編輯器,推薦使用vim
使用命令 vim first.sh打開(kāi),輸入i進(jìn)入編輯模式。
編寫(xiě)一個(gè)簡(jiǎn)單的linuxshell腳本
我們寫(xiě)入一個(gè)簡(jiǎn)單的shell腳本,注意第一行的代碼解釋器的指定,這里使用的是/bin/bash/ 解釋器 也可用其他的根據(jù)個(gè)人情況自己選擇。
腳本解釋?zhuān)?/p>
echo //顯示一串字符并自動(dòng)換行
read NAME //從屏幕獲取一段字符,并賦予NAME
$NAME //取NAME變量的值
# //只用一個(gè)#表示注釋文本
編寫(xiě)一個(gè)簡(jiǎn)單的linuxshell腳本
文件寫(xiě)完后按下esc鍵 退出插入模式,接著輸入:wq 保存文本并退出文本編輯。
編寫(xiě)一個(gè)簡(jiǎn)單的linuxshell腳本
輸入sh + 腳本名稱(chēng) 運(yùn)行腳本,或給文件可運(yùn)行權(quán)限 chmod +x 然后輸入./first.sh運(yùn)行腳本。
編寫(xiě)一個(gè)簡(jiǎn)單的linuxshell腳本
編寫(xiě)一個(gè)簡(jiǎn)單的linuxshell腳本