Shell指令碼中引數傳遞方法常用有8種

2021-07-09 14:33:44 字數 4031 閱讀 5073

shell指令碼中引數傳遞方法常用有8種

1. $# 傳遞到指令碼的引數個數

2. $* 以乙個單字串顯示所有向指令碼傳遞的引數變數。與位置變數不同,此選項引數可超過9個

3. $$ 指令碼執行的當前程序id號

4. $! 後台執行的最後乙個程序的程序id號

5. $@ 與$#相同,但是使用時加引號,並在引號中返回每個引數

6. $- 顯示shell使用的當前選項,與set命令功能相同

7. $? 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤

8. $()裡面放命令,可以在指令碼中執行該命令,並返回命令執行的輸出

下面給各位深入分析

1、命令列引數

向shell指令碼傳遞資料的最基本方式是使用命令列引數。

(1) 讀取引數

讀取輸入的引數的變數為位置引數,位置引數通過標準數字表示,

其中$0為程式名稱,$1為第乙個引數,$2為第二個引數,依次類推,直到$9為第九個引數。

shell指令碼自動將命令列引數賦值給各個位置變數。

同時輸入多個引數(可以是數值也可以是字串)時,必須使用空 格分隔(要想在引數值中包含空格,就必須使用單引號或雙引號)

當引數多於9個後,必須在shell指令碼內使用大括號將變數括起來,如$。從而可以使用任意個引數。

(2)讀取程式名稱

傳遞給變數$0的字串實際上是程式的路徑(根據呼叫方法決定是相對還是絕對路徑)。

使用basename命令可以去掉路徑字首,只獲得程式名稱(名字中不 可以有空格)。

(3)測試指令碼

當指令碼認為應該包含引數,卻實際上沒有資料時,就會出錯。

好的方法是 對引數進行檢查來保證使用引數前確實存在資料,可以使用-n引數來檢查。

ex: if [ –n 「$1」 ] then .. else .. fi

2、特殊的引數變數

用於跟蹤命令列引數

(1)引數計數

使用特殊變數$#測試執行指令碼時包含的命令列參 數個數。指令碼中任何位置都可以使用$#

ex: if [ $# –ne 2 ] 即可測試引數個數

可 以使用$來返回最後乙個命令列引數(當無引數時,$#為0, 而$為程式名)

(2)獲取所有資料

變數$*將命令列中提供的所有引數作為乙個單詞處理,它將多個引數看成 乙個引數。

變數$@將命令列中提供的所 有引數作為同乙個字串中的多個單詞處理。允許對其中的值進行迭代(一般使用for),分隔開不同引數

3、 移位

shift命 令能夠改變命令列引數的相對位置。預設將每個引數變數左移乙個位置(變數$0不變,把$1丟棄,注意 不可以恢復了!)

在不清楚引數數目情況下,這是乙個迭代引數的好辦法。

可 以為shift提供乙個引數,來實現多位移變化。

4、處理選項

選項是由破折號 引導的單個字母,用於更改命令的行為。

(1)找出選項

1)處理簡單選項

可以使用處理命令列引數相同的方法處理選項,抽取時使用case 語句進行判斷是否符合選項格式。

2)從引數中分離選項

同 時使用選項和引數時,可以使用--指示選項列表的結束。發現--後,shell就知道後面的是普通引數了,停止使用case處理選項。

3) 處理帶值的選項

選項後緊跟引數值,一種方法是在case中對應選項後使用shift和讀後一位引數的 方法處理。更好的方法如下:

(2)使用getopt命 令

getopt命令在處理選項和引數時 非常方便。它對引數進行重新組織,以便於解析

1)命令格式

getopt可以接受任意 形式的選項和引數列表,並自動將它們轉換為適當的格式。

命令格式為: getopt options optstring parameters

選項字串(opstring)用於定義命令列 中的有效選項字母,以及哪些選項字母需要引數值。

2)指令碼中使用getopt

需要使用set命令將現有的 命令列選項和引數替換為getopt命令生成的格式化形式。

需要將原始指令碼命令列引數送給getopt命令,然後將 getopt命令輸出送給set命令,如下:set – `getopts –q ab:cd 「$@」`

但 是getopt命令不能很好的處理帶有空格的引數值,它將空格解析為引數分隔符,而不是將雙引號引起來的兩個值合併成乙個引數。解決辦 法如下:

(3)更高階的getopts命令

getopts命令順序的對現有的shell引數變數進行處理, 每呼叫一次,只處理命令中檢測到的引數中的乙個。處理完所有引數後,以大於0的退出狀態退出。

非常適宜於在迴圈中解析所 有命令列引數

格式為: getopts optstring variable

$optarg包含需 要引數值的選項要使用的值,$optind包含getopts停止處理時在引數列表中的位置。

注意:當getopts處 理時,會將選項前的-去掉,所以對應的case中不需要破折號。

好的特性:

1)可以在引數值中包含空 格

2)選項字母和引數值中間可以沒有空格

3)將在命令列中找到的未定義的選項都繫結為單一的輸出——問號

5、標準化選項

有一些字母選項具有標準含義。最好按照標準含義定義選項意義

-a –c –d –e –f –h –i –l –n –o –q –r –s –v- x –y

6、獲取使用者輸入

當需要在執 行過程中獲得執行指令碼人員的輸入,使用read命 令

(1)基本讀取

read命 令接受標準輸入或其他檔案描述符輸入。讀入後將資料放入乙個標準變數中。

-p 允許在read命令列中直接指定乙個提示。

可以指定多個變數,也可以不指定(將放置在reply環境變數中)

(2)計 時

使用-t指定乙個計時器,計時數滿還未輸入,read返回乙個非0的退出狀態。

使 用-n指定輸入的字元個數,輸入達到預定數目時,就自動結束輸入

(3)默讀

使用 -s使輸入不顯示在終端(例如輸入密碼)

(4)讀取檔案

最常用的方法是使用cat命令,並通過管 道傳給包含read的while語句。

ex: cat test | while read line

為了讓各位更多深入了解給一些例子

#!/bin/bash

#extracting command text_text_text_line options as parameters

help_info()

if [ $# -lt 0 ]

then

help_info

finomal_opts_act()

#用shell命令自建的選項解析,可以按照自己的想法實現

#優點:自己定製,沒有做不到,只有想不到

#缺點:麻煩

getopt_act()

#用getopt命令解析選項和引數

#優點:相對與getopts來說是個半自動解析,自動組織選項和引數,用 -- 符號將選項與引數隔開

#缺點:相對於getopts的缺點

#1.需要與set -- 命令配合,不是必須,需要手動shift

#2.選項引數中不支援空格如 -a -b dog -c "earth moon" -d -f param1 param2 就會解析錯誤

getopts_act()

#getopts 命令解析選項和引數

#優點:可在引數中包含空格如:-c "earth moon"

#            選項字母和引數值之間可以沒有空格如:-bdog

#            可將未定義的選項繫結到?輸出

#            unknow option: ?

nomal_opts_act -a -b dog -c earth -d -f param1 param2

getopts_act -a -b dog -c "earth moon" -d -f param1 param2

getopt_act -a -b dog -c earth -d -f param1 param2

shell 啟動並向指令碼中傳遞引數

shell傳遞引數教程 n表示第n個傳入的引數,0特指當前執行檔案的名字 echo the name of current file is echo when n 1,is echo 傳遞到當前指令碼的引數的個數,當然是不包括第0個了 echo for input in 對輸入的引數進行遍歷並列印 ...

shell中指令碼引數傳遞getopts

while getopts a b c opt docase opt in a echo 引數a的值 optarg b echo 引數b的值 optarg c echo 引數c的值 optarg echo 未知引數 exit 1 esac done 輸出bogon desktop macname t...

shell指令碼 函式傳遞引數

在乙個指令碼中,多個函式之間可能需要相互傳遞引數,之前一直對引數的傳遞以及引用有些疑問,今天做了幾個小測試例子 1 bin bash function f1 function f2 f1 1執行結果 temp2.sh pp mj ubuntu temp2.sh pp f1pp f2pp2 bin b...