如何將參數傳遞給Bash腳本

命令,語法和示例

您可以編寫一個bash腳本 ,以便在從命令行調用腳本時接收指定的參數。 當腳本根據輸入參數(參數)的值執行稍微不同的功能時使用此方法。

例如,您可能有一個名為“stats.sh”的腳本,用於對文件執行特定的操作,例如對其單詞進行計數。 如果您希望能夠在多個文件上使用該腳本,最好將文件名作為參數傳遞,以便您可以對要處理的所有文件使用相同的腳本。 例如,如果要處理的文件的名稱是“歌曲列表”,則可以輸入以下命令行:

sh stats.sh歌曲列表

參數在腳本中使用變量$ 1,$ 2,$ 3等進行訪問,其中$ 1指向第一個參數,$ 2指向第二個參數,依此類推。 以下示例說明了這一點:

FILE1 = $ 1 wc $ FILE1

為了便於閱讀,請為第一個參數($ 1)的值指定一個描述性名稱的變量,然後在該變量($ FILE1)上調用字數計數實用程序( wc )。

如果參數數量可變,則可以使用“$ @”變量,該變量是所有輸入參數的數組。 這意味著你可以使用for循環迭代地處理每一個,如下例所示:

對於“$ @”中的FILE1,執行wc $ FILE1

以下是如何使用命令行中的參數調用此腳本的示例:

sh stats.sh songlist1 songlist2 songlist3

如果參數具有空格,則需要用單引號括起來。 例如:

sh stats.sh'歌曲列表1''歌曲列表2''歌曲列表3'

通常會編寫腳本,以便用戶可以使用標誌以任何順序傳遞參數。 使用flags方法,你也可以使一些參數成為可選的。

假設您有一個腳本根據指定參數(如“用戶名”,“日期”和“產品”)從數據庫檢索信息,並以指定的“格式”生成報告。 現在您要編寫腳本,以便在調用腳本時可以傳入這些參數。 它可能看起來像這樣:

makereport -u jsmith -p筆記本電腦-d 10-20-2011 -f pdf

Bash使用“getopts”功能啟用此功能。 對於上面的例子,你可以使用getopts,如下所示:

這是一個while循環 ,它使用“getopts”函數和一個所謂的“optstring”,在本例中為“u:d:p:f:”來遍歷參數。 while循環遍歷optstring,其中包含可用於傳遞參數的標誌,並將為該標誌提供的參數值分配給變量“option”。 case-statement然後將變量“option”的值賦給一個全局變量,該全局變量可以在所有參數被讀取後使用。

optstring中的冒號表示值對於相應的標誌是必需的。 在上面的例子中,所有的標誌後面跟著一個冒號:“u:d:p:f:”。 這意味著,所有標誌都需要一個值。 例如,如果“d”和“f”標誌預期不具有值,則optstring將是“u:dp:f”。

optstring開頭的冒號,例如“:u:d:p:f:”,具有完全不同的含義。 它允許你處理在optstring中沒有表示的標誌。 在這種情況下,“選項”變量的值被設置為“?” 並且“OPTARG”的值被設置為意外標誌。 允許您顯示一條合適的錯誤消息,通知用戶該錯誤。

前面沒有標誌的參數被getopts忽略。 如果在調用腳本時未提供optstring中指定的標誌,則不會發生任何事情,除非您在代碼中特別處理這種情況。 任何不被getops處理的參數仍然可以用常規的$ 1,$ 2等變量捕獲。