欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么復用外部Shell腳本

這篇文章主要為大家展示了“怎么復用外部Shell腳本”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“怎么復用外部Shell腳本”這篇文章吧。

創(chuàng)新互聯(lián)科技有限公司專業(yè)互聯(lián)網(wǎng)基礎服務商,為您提供眉山聯(lián)通機房高防服務器,成都IDC機房托管,成都主機托管等互聯(lián)網(wǎng)服務。

執(zhí)行外部腳本的方式

假如在當前目錄有 a.sh 腳本,內容如下

#!/bin/bash  echo "a.sh..."

在一個腳本中執(zhí)行外部腳本主要有以下幾種方式

  • source 外部腳本名字

在當前目錄下的 b.sh 腳本,內容如下:

#!/bin/bash  source a.sh echo "b.sh..."

執(zhí)行 ./b.sh,結果如下

[root@ecs-centos-7 ~]# ./b.sh  a.sh... b.sh...

腳本中 source a.sh 命令 會先執(zhí)行當前目錄下的 a.sh腳本,所以結果會先輸出 a.sh...再輸出 b.sh腳本本身的打印

  • 點號 外部腳本名字

把 b.sh 腳本中執(zhí)行a.sh腳本的語句修改成 點號 + 空格 + a.sh ,修改之后的腳本內容如下:

注意:點號和a.sh之間一定要加上空格,否則執(zhí)行的時候會出錯

#!/bin/bash  . a.sh echo "b.sh..."

執(zhí)行 ./b.sh,結果如下

[root@ecs-centos-7 ~]# ./b.sh  a.sh... b.sh...

在上述腳本中, . a.sh 會先執(zhí)行a.sh腳本, 結果會先輸出 a.sh...再輸出 b.sh...

  • sh 外部腳本名字

sh 外部腳本名字 和 ./外部腳本名字 兩種方式是一樣的,選擇哪一種方式都沒問題,下面是以前面一種方式為例說明的

把 b.sh 腳本中 source a.sh修改成 sh a.sh ,修改之后的腳本內容如下:

#!/bin/bash  sh a.sh echo "b.sh..."

執(zhí)行 ./b.sh 命令, 結果如下

[root@ecs-centos-7 ~]# ./b.sh  a.sh... b.sh...

可以看出,結果輸出和上面兩種方式是一樣的

三種方式的有什么區(qū)別

調用外部腳本有 source 外部腳本 、點號 外部腳本、sh 外部腳本 三種方式,它們之間有什么區(qū)別呢?

其中,source 外部腳本 和 點號 外部腳本 兩種方式是相同的,當前腳本繼承了外部腳本的全局變量和函數(shù),  相當于把外部腳本的函數(shù)和全局變量導入了當前腳本中

修改 a.sh 和 b.sh 腳本, 內容如下

a.sh腳本

#!/bin/bash  VAR_A=10  func_a() {   echo "a.sh...pid:$$,param:$1" }

b.sh腳本

#!/bin/bash  source a.sh   func_a $1 echo "vara:$VAR_A" echo "b.sh...pid:$$"

執(zhí)行 ./b.sh 5 命令,結果如下

[root@ecs-centos-7 ~]# ./b.sh 5 a.sh...pid:21485,param:5 vara:10 b.sh...pid:21485

兩個腳本中的 $$ 是指執(zhí)行腳本的進程ID,從結果可以看出,a.sh 和 b.sh 都是在同一個進程內執(zhí)行的,所以在 b.sh 腳本中執(zhí)行 source  a.sh 命令,會把 a.sh 腳本中的全局變量 VAR_A 和函數(shù) func_a導入到 b.sh中

在 b.sh中打印變量 VAR_A,輸出的值和 a.sh中相同,調用 func_a函數(shù),輸出也說明了調用的是 a.sh中的函數(shù)

source 外部腳本 、點號 外部腳本 兩種方式是相同的, 所以, 把 b.sh 中 source a.sh 修改成 . a.sh , 執(zhí)行  ./b.sh 5, 結果依然是相同的

由于 sh 外部腳本的方式是當前腳本和外部腳本在兩個不同的進程中執(zhí)行,所以當前腳本不能直接使用外部腳本中的函數(shù)和全局變量

修改 a.sh 和 b.sh 腳本, 內容如下

a.sh腳本

#!/bin/bash  test_a() {   echo "a.sh...test_a" }  echo "a.sh...pid:$$"

b.sh腳本

#!/bin/bash  sh a.sh  echo "b.sh...pid:$$"  test_a

執(zhí)行 ./b.sh 命令,結果如下

[root@ecs-centos-7 ~]# ./b.sh  a.sh...pid:21818 b.sh...pid:21817 ./b.sh:行7: test_a: 未找到命令

從結果可以看出,執(zhí)行 a.sh 和 b.sh 的進程ID是不同的,b.sh腳本進程找不到test_a函數(shù),所以在b.sh中調用test_a 函數(shù)會提示  未找到命令

調用外部腳本中的函數(shù)

上一節(jié)講到 sh 外部腳本 的方式無法直接使用外部腳本中函數(shù)和全局變量,下面提供幾種方法可以解決這個問題

  • case 分支選擇

這種方法類似于程序代碼中的 switch case 語句,通過switch  選擇不同的分支從而執(zhí)行不同的邏輯,shell腳本中是使用case關鍵字來實現(xiàn)的

a.sh腳本

#!/bin/bash  VAR_A=10  test_a() {    echo "test_a..pid:$$,p1:$1,p2:$2" } get_var() {   echo ${VAR_A} }  case "$1" in     ta)       test_a $2 $3       ;;     var)       get_var       ;;    *)       echo "parameter err..." esac

b.sh腳本

#!/bin/bash  echo "b.sh...pid:$$"  sh a.sh ta 3 5  ret=$(sh a.sh var)  echo "ret:$ret"

執(zhí)行 ./b.sh 命令,結果如下

[root@ecs-centos-7 ~]# ./b.sh  b.sh...pid:24813 test_a..pid:24814,p1:3,p2:5 ret:10

腳本b.sh一開始打印了調用自身的進程ID

sh a.sh ta 3 5 語句是調用a.sh腳本,傳入的三個參數(shù)分別是ta, 3, 5 ,執(zhí)行a.sh時,傳入的第一個參數(shù)  ta經(jīng)過case匹配之后調用 test_a函數(shù),并把剩下的兩個參數(shù) 3和5作為參數(shù)傳入函數(shù)

ret=$(sh a.sh var) 語句時調用a.sh腳本,傳入一個var  參數(shù),經(jīng)過case匹配之后調用get_var函數(shù),該函數(shù)的作用輸出腳本中全局變量VAR_A的值,語句中$()的作用是獲取()中命令的返回值,這里是把a.sh腳本中  get_var函數(shù)的返回值賦值給 ret變量,所以該變量的值是 a.sh腳本中全局變量VAR_A的值

說明:如果想要獲取函數(shù)的返回值,可以在函數(shù)中用 echo 打印相應的輸出值,然后使用$(函數(shù)名 參數(shù)列表)可以獲取到函數(shù)中打印的值,如上面b.sh腳本中  ret=$(sh a.sh var)語句,變量ret的值是 a.sh腳本中 get_var函數(shù)輸出的值10

這里需要注意的是, 如果函數(shù)中有echo調試日志,那么調試日志也會一起返回

  • 函數(shù)調用模板

上面介紹的用 case 關鍵字去匹配調用不同的函數(shù)有一個缺點,每次a.sh腳本中增加一個函數(shù)的時候,case  就需要添加一個分支,分支里調用不同的函數(shù),還需要注意函數(shù)是否有參數(shù)傳入以及參數(shù)數(shù)量是否正確

我們可以在每個供外部調用腳本的尾部加上以下的語句,就可以解決上述問題, 具體語句如下

if [ $# -ge 1 ]; then    name="$1"    shift 1    $name "$@" fi

上述語句首先判斷調用腳本時傳入的參數(shù)數(shù)量,只有參數(shù)數(shù)量大于等于1才有效,傳入的第一個參數(shù)表示函數(shù)名字,從第二個參數(shù)到最后一個參數(shù)都會作為參數(shù)傳入到函數(shù)中

這里的 shift 1 是把傳入腳本的參數(shù)左移一個位置,比如:傳入腳本參數(shù)有 $1 $2 $3三個參數(shù),左移一個位置之后, $2 移動到 $1  的位置,$3 移動到 $2 的位置,參數(shù)數(shù)量變?yōu)?了

原因: 傳入腳本的參數(shù)中,第一個參數(shù)是函數(shù)名字,從第二個參數(shù)起才是函數(shù)的參數(shù),如果不做左移處理,第一個參數(shù)函數(shù)名字也會作為參數(shù)傳入到函數(shù)中

下面是完整的腳本內容

a.sh腳本

#!/bin/bash  VAR_A=10  test_a() {    echo "test_a..pid:$$,p1:$1,p2:$2" }  get_var() {   echo ${VAR_A} }  if [ $# -ge 1 ]; then    name="$1"    shift 1    $name "$@" fi

b.sh腳本

#!/bin/bash  echo "b.sh...pid:$$"  sh a.sh test_a 3 5  ret=$(sh a.sh get_var)

執(zhí)行 ./b.sh 命令,結果如下

[root@ecs-centos-7 ~]# ./b.sh  b.sh...pid:25086 test_a..pid:25087,p1:3,p2:5 ret:10

可以看出,結果和上面 case 的方法是一樣的

現(xiàn)在其他腳本中都可以通過 sh a.sh 函數(shù)名 參數(shù)列表 這樣的方式調用 a.sh 腳本中的函數(shù)了,通過 $(sh a.sh 函數(shù)名  參數(shù)列表)的方式獲取 a.sh腳本函數(shù)的返回值

  • 兩者的優(yōu)缺點

與case分支選擇的方式相比,函數(shù)調用模板的優(yōu)點是調用者只需要關心復用的腳本中函數(shù)名、函數(shù)傳入?yún)?shù)、函數(shù)返回值就可以直接使用

缺點是如果有多個腳本都調用了復用腳本中的函數(shù),當復用腳本中函數(shù)名變更時,需要修改所有調用了它的地方

函數(shù)調用模板方式的缺點恰恰是case分支選擇方式的有點,case分支選擇的方式時根據(jù)傳入的字符串參數(shù)調用不同的函數(shù),這里的字符串參數(shù)相當于函數(shù)的別名,只要這個參數(shù)保持不變,腳本中的函數(shù)名字可以任意變更

上述的優(yōu)缺點比較只是一個相對的比較,實際應用中下不會很明顯,大部分情況兩種方式都可以使用

以上是“怎么復用外部Shell腳本”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:怎么復用外部Shell腳本
網(wǎng)頁URL:http://chinadenli.net/article4/gejgie.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)網(wǎng)站導航定制網(wǎng)站網(wǎng)站營銷網(wǎng)站收錄品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化