Linux中執(zhí)行Shell腳本的三種實(shí)現(xiàn)方式
Shell 腳本的執(zhí)行方式通常有
如下三種:
- (1)bash script-name 或者 sh script-name;
- (2)path/script-name或者./script-name;
- (3)sourcescript-name或者. script-name。
下面,分別介紹下這三種方式的特點(diǎn):
(1)bash script-name或者sh script-name
這是當(dāng)腳本文件本身沒(méi)有可執(zhí)行權(quán)限(即文件權(quán)限屬性x位為-號(hào))時(shí)常使用的方法,或者腳本文件開(kāi)頭沒(méi)有指定解釋器時(shí)需要使用的方法。
推薦使用這種方法。
(2)path/script-name或者./script-name
指在當(dāng)前路徑下執(zhí)行腳本(腳本需要有執(zhí)行權(quán)限),需要將腳本文件的權(quán)限改為可執(zhí)行(即文件權(quán)限屬性為x位)。
具體方法為:chmod a+x script-name。然后通過(guò)執(zhí)行腳本絕對(duì)路徑或者相對(duì)路徑就可以執(zhí)行腳本了。
注意:
- 在生產(chǎn)環(huán)境中,運(yùn)維人員由于忘記為該腳本設(shè)置可執(zhí)行權(quán)限,然后直接使用,導(dǎo)致出錯(cuò)。
- 因此,推薦第一種 bashscript-name。
(3)source script-name或者. script-name
source或者“.”命令的功能是:讀入腳本并執(zhí)行腳本,即在當(dāng)前Shell中執(zhí)行source或“.”加載并執(zhí)行的相關(guān)腳本文件的命令及語(yǔ)句,而不是產(chǎn)生一個(gè)子Shell來(lái)執(zhí)行文件中的命令。
注意:這是和其他幾種執(zhí)行shell方式的最大不同。
舉個(gè)栗子
新建一個(gè)文件test_sh.sh,不給它賦予任何可執(zhí)行的權(quán)限x。
編輯內(nèi)容如下:
文件以及文件中內(nèi)容與常見(jiàn)的shell不同之處在于,這里的文件沒(méi)有賦予可執(zhí)行權(quán)限以及在文件內(nèi)容中的首行中沒(méi)有添加#!/bin/bash。
我們現(xiàn)在用上述介紹的幾種方式來(lái)測(cè)試下效果。
第二種方式 ./script-name,執(zhí)行效果如下:
報(bào)權(quán)限拒絕,Permission denied,此時(shí),我們只要更改文件的屬性為可執(zhí)行即可。
執(zhí)行第一種bash script-name,效果如下:
可以成功執(zhí)行,輸出:hello。但是,我們輸入命令:echo $name,發(fā)現(xiàn)如下:
name的值是空的。
不難理解,bash script-name是產(chǎn)生了一個(gè)子進(jìn)程shell,而我們當(dāng)前的操作還在父shel中因此得不到該變量值。
執(zhí)行第三種方法. test_sh.sh,效果如下:
可以成功的輸出變量的值。
這是因?yàn)閟ource script-name和. script-name是將script-name中的內(nèi)容直接加載到當(dāng)前的shell,因此能夠輸出當(dāng)前變量的值。
剛才第二種方式我們執(zhí)行失敗,現(xiàn)在我們通過(guò)chmod a+x script-name,然后再次執(zhí)行上述命令,查看效果:
注意:該種方式也是產(chǎn)生了一個(gè)子進(jìn)程Shell,因此echo $name仍然找不到該變量。
補(bǔ)充知識(shí)點(diǎn)
一個(gè)規(guī)范的Shell腳本在第一行會(huì)指出由哪個(gè)程序(解釋器)來(lái)執(zhí)行腳本中的內(nèi)容,這一行內(nèi)容在Linux bash的編程一般為:
#!/bin/bash
或
#!/bin/sh
注意:
(1)在Shell中如果一行的第一個(gè)字母是#,則是注釋?zhuān)巧厦鎯蓚€(gè)是寫(xiě)在第一行,所以不是腳本注釋行,如果寫(xiě)在某個(gè)命令之后,則變成注釋行。
(2)sh為bash的軟鏈接,大多數(shù)情況下,腳本的開(kāi)頭使用“#!/bin/bash”和“#!/bin/sh”是沒(méi)有區(qū)別的,但更規(guī)范的寫(xiě)法是在腳本的開(kāi)頭使用“#!/bin/bash”。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux系統(tǒng)配置(服務(wù)控制)詳細(xì)介紹
大家好,本篇文章主要講的是Linux系統(tǒng)配置(服務(wù)控制)詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Apache開(kāi)啟并實(shí)現(xiàn)網(wǎng)站偽靜態(tài)化的方法
Apache的Mod_Rewrite對(duì)URL進(jìn)行重寫(xiě),實(shí)現(xiàn)網(wǎng)站偽靜態(tài)化,這里就為大家介紹一下2022-08-08使用VMware虛擬機(jī)安裝Linux(CentOS7鏡像)
這篇文章介紹了使用VMware虛擬機(jī)安裝Linux(CentOS7鏡像)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12VirtualBox 未指定要bridged的網(wǎng)絡(luò)界面的解決辦法
這篇文章主要介紹了VirtualBox 未指定要bridged的網(wǎng)絡(luò)界面的解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家解決遇到這樣的問(wèn)題,需要的朋友可以參考下2017-10-10apache在win2003下的安全設(shè)置(配合文件夾權(quán)限目錄,很好很安全)
眾所周知,在windows下當(dāng)Apache第 一次被安裝為服務(wù)后,它會(huì)以用戶“System”(本地系統(tǒng)賬號(hào))運(yùn)行。如果web服務(wù)器的所有資源都在本地系統(tǒng)上,這樣做會(huì)問(wèn)題比較少,但是將會(huì)具有很 大的安全 權(quán)限來(lái)影響本地機(jī)器,因此千萬(wàn)不能開(kāi)啟System帳號(hào)的網(wǎng)絡(luò)權(quán)限2012-01-01關(guān)于CentOS 7下sqlite3找不到的問(wèn)題解決
這篇文章主要給大家介紹了關(guān)于CentOS 7下sqlite3找不到問(wèn)題的解決方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-07-07Ubuntu無(wú)網(wǎng)絡(luò)標(biāo)識(shí)的問(wèn)題及解決
這篇文章主要介紹了Ubuntu無(wú)網(wǎng)絡(luò)標(biāo)識(shí)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04