**:
在新程序中執行 shell 指令碼有多種方法。
1) 將 shell 指令碼作為程式執行
shell 指令碼也是一種解釋執行的程式,可以在終端直接呼叫(需要使用 chmod 命令給 shell 指令碼加上執行許可權),如下所示:
[mozhiyan@localhost ~]$ cd demo #切換到 test.sh 所在的目錄[mozhiyan@localhost demo]$ chmod +x ./test.sh #給指令碼新增執行許可權
[mozhiyan@localhost demo]$ ./test.sh #執行指令碼檔案
hello world ! #執行結果
第 2 行中,chmod +x
表示給 test.sh 增加執行許可權。
第 3 行中,./
表示當前目錄,整條命令的意思是執行當前目錄下的 test.sh 指令碼。如果不寫./
,linux 會到系統路徑(由 path 環境變數指定)下查詢 test.sh,而系統路徑下顯然不存在這個指令碼,所以會執行失敗。
通過這種方式執行指令碼,指令碼檔案第一行的#!/bin/bash
一定要寫對,好讓系統查詢到正確的直譯器。
2) 將 shell 指令碼作為引數傳遞給 bash 直譯器
[mozhiyan@localhost ~]$ cd demo #切換到 test.sh所在的目錄
[mozhiyan@localhost demo]$ /bin/bash test.sh
#使用bash的絕對路徑
hello world ! #執行結果
通過這種方式執行指令碼,不需要在指令碼檔案的第一行指定直譯器資訊,寫了也沒用。
更加簡潔的寫法是執行 bash 命令。bash 是乙個外部命令,shell 會在 /bin 目錄中找到對應的應用程式,也即 /bin/bash。
[mozhiyan@localhost ~]$ cd demo[mozhiyan@localhost demo]$ bash test.sh
hello world !
這兩種寫法在本質上是一樣的:第一種寫法給出了絕對路徑,會直接執行 bash 直譯器;第二種寫法通過 bash 命令找到 bash 直譯器所在的目錄,然後再執行,只不過多了乙個查詢的過程而已。
檢測是否開啟了新程序
有些讀者可能會疑問,你怎麼知道開啟了新程序?你有什麼證據嗎?既然如此,那我就來給大家驗證一下吧。
linux 中的每乙個程序都有乙個唯一的 id,稱為 pid,使用$$
變數就可以獲取當前程序的 pid。$$
是 shell 中的特殊變數,稍後我會在《shell特殊變數》一節中展開講解,讀者在此不必深究。
首先編寫如下的指令碼檔案,並命名為 check.sh:
#!/bin/bash
echo $$ #輸出當前程序pid
然後使用以上兩種方式來執行 check.sh:
[mozhiyan@localhost demo]$ echo $$你看,程序的 pid 都不一樣,當然就是兩個程序了。這裡需要引入乙個新的命令——source 命令。source 是 shell 內建命令的一種,它會讀取指令碼檔案中的**,並依次執行所有語句。你也可以理解為,source 命令會強制執行指令碼檔案中的全部命令,而忽略指令碼檔案的許可權。2861 #當前程序的pid
[mozhiyan@localhost demo]$ chmod +x ./check.sh
[mozhiyan@localhost demo]$ ./check.sh
4597 #新程序的pid
[mozhiyan@localhost demo]$ echo $$
2861 #當前程序的pid
[mozhiyan@localhost demo]$ /bin/bash check.sh
4584 #新程序的pid
source 命令的用法為:
source filename
也可以簡寫為:
. filename
兩種寫法的效果相同。對於第二種寫法,注意點號.
和檔名中間有乙個空格。
例如,使用 source 執行上節的 test.sh:
[mozhiyan@localhost ~]$ cd demo #切換到test.sh所在的目錄你看,使用 source 命令不用給指令碼增加執行許可權,並且寫不寫[mozhiyan@localhost demo]$ source ./test.sh #使用source
hello world !
[mozhiyan@localhost demo]$ source test.sh #使用source
hello world !
[mozhiyan@localhost demo]$ . ./test.sh #使用點號
hello world !
[mozhiyan@localhost demo]$ . test.sh #使用點號
hello world !
./
都行,是不是很方便呢?
檢測是否在當前 shell 程序中
我們仍然借助$$
變數來輸出程序的 pid,如下所示:
[mozhiyan@localhost ~]$ cd demo你看,程序的 pid 都是一樣的,當然是同乙個程序了。作為初學者,你可能看不懂這些執行方式有什麼區別,沒關係,暫時先留個疑問吧,後續教程中我們會逐一講解。[mozhiyan@localhost demo]$ echo $$
5169 #當前程序pid
[mozhiyan@localhost demo]$ source ./check.sh
5169 #shell指令碼所在程序pid
[mozhiyan@localhost demo]$ echo $$
5169 #當前程序pid
[mozhiyan@localhost demo]$ . ./check.sh
5169 #shell指令碼所在程序pid
如果需要在新程序中執行 shell 指令碼,我一般使用bash test.sh
這種寫法;如果在當前程序中執行 shell 指令碼,我一般使用. ./test.sh
這種寫法。這是我個人的風格。
最後再給大家演示乙個稍微複雜的例子。本例中使用 read 命令從鍵盤讀取使用者輸入的內容並賦值給 url 變數,最後在顯示器上輸出。
#!/bin/bash
echo "what is the url of the shell tutorial?"
read url
echo "$url is very fast!"
執行指令碼:
[mozhiyan@localhost demo]$ . ./test.shwhat is the url of the shell tutorial?
is very fast!
SHELL指令碼 多命令邏輯執行順序
bash shell系列文章 linux中可以使用分號 雙and號 和雙豎線 來連線多個命令。單 符號也算命令連線符號,只不過它是將其前面的命令放入後台執行,所以可以變相地實現命令並行執行。command1 command2 命令之間沒有邏輯關係。分號連線的命令會按照順序從前向後依次執行,但分號兩端...
shell指令碼多程序
shell指令碼再執行過程中就乙個程序,從頭到尾 下面配置shell指令碼執行過程中啟動多個程序同時執行 bin bash for i 1 i 10 i do echo i sleep 10 done wait echo e seconds 注 seconds 是執行完指令碼所用的時間 wait 是...
Linux執行SHELL指令碼的幾種方法
1 source 或.命令用法 source filename 或 filename 作用 在當前bash環境下讀取並執行filename中的命令,該filename檔案可以 無執行許可權。如 source bash profile 與 bash profile 兩者等效。source 或點 命令通...