Linux中執(zhí)行Shell腳本的三種實現(xiàn)方式
Shell 腳本的執(zhí)行方式通常有
如下三種:
- (1)bash script-name 或者 sh script-name;
- (2)path/script-name或者./script-name;
- (3)sourcescript-name或者. script-name。
下面,分別介紹下這三種方式的特點:
(1)bash script-name或者sh script-name
這是當(dāng)腳本文件本身沒有可執(zhí)行權(quán)限(即文件權(quán)限屬性x位為-號)時常使用的方法,或者腳本文件開頭沒有指定解釋器時需要使用的方法。
推薦使用這種方法。
(2)path/script-name或者./script-name
指在當(dāng)前路徑下執(zhí)行腳本(腳本需要有執(zhí)行權(quán)限),需要將腳本文件的權(quán)限改為可執(zhí)行(即文件權(quán)限屬性為x位)。
具體方法為:chmod a+x script-name。然后通過執(zhí)行腳本絕對路徑或者相對路徑就可以執(zhí)行腳本了。
注意:
- 在生產(chǎn)環(huán)境中,運維人員由于忘記為該腳本設(shè)置可執(zhí)行權(quán)限,然后直接使用,導(dǎo)致出錯。
- 因此,推薦第一種 bashscript-name。
(3)source script-name或者. script-name
source或者“.”命令的功能是:讀入腳本并執(zhí)行腳本,即在當(dāng)前Shell中執(zhí)行source或“.”加載并執(zhí)行的相關(guān)腳本文件的命令及語句,而不是產(chǎn)生一個子Shell來執(zhí)行文件中的命令。
注意:這是和其他幾種執(zhí)行shell方式的最大不同。
舉個栗子
新建一個文件test_sh.sh,不給它賦予任何可執(zhí)行的權(quán)限x。

編輯內(nèi)容如下:

文件以及文件中內(nèi)容與常見的shell不同之處在于,這里的文件沒有賦予可執(zhí)行權(quán)限以及在文件內(nèi)容中的首行中沒有添加#!/bin/bash。
我們現(xiàn)在用上述介紹的幾種方式來測試下效果。
第二種方式 ./script-name,執(zhí)行效果如下:

報權(quán)限拒絕,Permission denied,此時,我們只要更改文件的屬性為可執(zhí)行即可。
執(zhí)行第一種bash script-name,效果如下:

可以成功執(zhí)行,輸出:hello。但是,我們輸入命令:echo $name,發(fā)現(xiàn)如下:

name的值是空的。
不難理解,bash script-name是產(chǎn)生了一個子進程shell,而我們當(dāng)前的操作還在父shel中因此得不到該變量值。
執(zhí)行第三種方法. test_sh.sh,效果如下:

可以成功的輸出變量的值。
這是因為source script-name和. script-name是將script-name中的內(nèi)容直接加載到當(dāng)前的shell,因此能夠輸出當(dāng)前變量的值。
剛才第二種方式我們執(zhí)行失敗,現(xiàn)在我們通過chmod a+x script-name,然后再次執(zhí)行上述命令,查看效果:

注意:該種方式也是產(chǎn)生了一個子進程Shell,因此echo $name仍然找不到該變量。
補充知識點
一個規(guī)范的Shell腳本在第一行會指出由哪個程序(解釋器)來執(zhí)行腳本中的內(nèi)容,這一行內(nèi)容在Linux bash的編程一般為:
#!/bin/bash
或
#!/bin/sh
注意:
(1)在Shell中如果一行的第一個字母是#,則是注釋,但是上面兩個是寫在第一行,所以不是腳本注釋行,如果寫在某個命令之后,則變成注釋行。
(2)sh為bash的軟鏈接,大多數(shù)情況下,腳本的開頭使用“#!/bin/bash”和“#!/bin/sh”是沒有區(qū)別的,但更規(guī)范的寫法是在腳本的開頭使用“#!/bin/bash”。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
linux服務(wù)器下配置多tomcat實現(xiàn)實例
這篇文章主要介紹了linux服務(wù)器下配置多tomcat的相關(guān)資料,需要的朋友可以參考下2017-05-05
CentOS8.0 網(wǎng)絡(luò)配置的實現(xiàn)
這篇文章主要介紹了CentOS8.0 網(wǎng)絡(luò)配置的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Linux使用iptables限制多個IP訪問你的服務(wù)器
iptables是一個管理netfilter的工具。這篇文章主要介紹了Linux使用iptables限制多個IP訪問你的服務(wù)器的相關(guān)知識,需要的朋友可以參考下2018-10-10
Apache中Virtual Host虛擬主機配置及rewrite參數(shù)說明
這篇文章主要介紹了Apache中Virtual Host虛擬主機配置及rewrite模塊中的重要參數(shù)說明,是在同一個Apache服務(wù)器軟件上部署多個站點的基礎(chǔ)方法,需要的朋友可以參考下2016-03-03
linux系統(tǒng)實現(xiàn)重啟網(wǎng)卡命令
本文介紹了三種在Linux系統(tǒng)中重啟網(wǎng)卡的方法,包括使用服務(wù)命令、ifconfig命令以及ifdown/ifup命令,這些方法可以幫助系統(tǒng)管理員在維護或故障排除時快速恢復(fù)網(wǎng)絡(luò)連接2025-10-10

