執行Shell指令碼(多種方法)

2022-06-10 12:48:16 字數 3638 閱讀 8844

**:

在新程序中執行 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 $$

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

你看,程序的 pid 都不一樣,當然就是兩個程序了。這裡需要引入乙個新的命令——source 命令。source 是 shell 內建命令的一種,它會讀取指令碼檔案中的**,並依次執行所有語句。你也可以理解為,source 命令會強制執行指令碼檔案中的全部命令,而忽略指令碼檔案的許可權。

source 命令的用法為:

source filename

也可以簡寫為:

. filename

兩種寫法的效果相同。對於第二種寫法,注意點號.和檔名中間有乙個空格。

例如,使用 source 執行上節的 test.sh:

[mozhiyan@localhost ~]$ cd demo              #切換到test.sh所在的目錄

[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 !

你看,使用 source 命令不用給指令碼增加執行許可權,並且寫不寫./都行,是不是很方便呢?

檢測是否在當前 shell 程序中

我們仍然借助$$變數來輸出程序的 pid,如下所示:

[mozhiyan@localhost ~]$ cd demo

[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

你看,程序的 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.sh

what 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 或點 命令通...