這是一個用於編寫接受選項和/或參數的 bash 腳本的框架。使用簡單的聲明性語法定義腳本接受的選項和參數,並讓bash-args :
它的設計宗旨是簡單易用、不礙事,並提供完美的使用者體驗。
它的目標是可移植的,測試套件通過了 bash >= 3.2 的所有主要版本。
要在腳本中使用bash-args ,只需取得init.sh
檔案即可。
這是一個範例腳本eval-command.sh
:
#! /usr/bin/env bash
# Summary : My first bash script using bash-args.
#
# Description : This takes a command as argument, and runs it.
#
# Argument : command
#
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
. path/to/bash-args/init.sh
# After sourcing the script, you can use the $directory and the $dry_run
# variables to get the values of the options typed (or not) in the command line.
# The other arguments are available as standard bash arguments $1, $2, etc.
command= " cd $directory && $1 "
if [[ $dry_run -eq 1 ]] ; then
echo " $command "
else
eval " $command "
fi
讓我們嘗試使用選項來執行此命令:
$ eval-command.sh --dry-run --directory /home 'echo hello'
cd /home && echo hello
您可以使用簡短的選項,並且可以將它們分組:
$ eval-command.sh -nd /home 'echo hello'
cd /home && echo hello
使用簡單的命令完成設定標籤:
$ eval $(eval-command.sh _register_completion)
提供了幫助頁面:
$ eval-command.sh --help
My first bash script using bash-args.
Usage : eval-command.sh [OPTIONS] [COMMAND]
This takes a command as argument, and runs it.
Options :
--help | -h
Show this help.
--dry-run | -n
Don't execute, just print.
--directory | -d [DIRECTORY]
The directory in which to run the command.
Bash-args也可以管理子命令:
main-script.sh help subcmd1
或main-script.sh subcmd1 --help
可以取得每個指令的幫助頁面。為此,請在主腳本末尾呼叫cmd_run
函數,並透過將 shell 腳本新增至cmd/
目錄來定義子命令。您的專案結構應如下所示:
main-script.sh
cmd/
- subcmd1.sh
- subcmd2.sh
要記錄子命令並定義其選項和參數,請在每個子命令的第一個註釋區塊中寫入元數據,就像在主腳本中一樣。
主腳本中定義的選項適用於所有子命令,而子命令中定義的選項僅適用於該特定子命令。
腳本元資料遵循非常簡單的語法:在第一個註解區塊中,以單字開頭的每行後跟分號定義一個新字段,分號後面的所有內容定義其值。以下行(直到下一個欄位開始)將附加到該值。
以下是bash-args使用的欄位。
--version
選項來列印其名稱和版本。選項在選項元資料中定義,如範例腳本所示:
# Options :
#
# % dry-run
# desc="Don't execute, just print."
# short="n" type="flag" variable="dry_run" value=1 default=0
#
# % directory
# desc="The directory in which to run the command." argument=directory
# short="d" type="option" variable="directory" default="$(pwd)"
#
選項以%
開頭,後面跟著其名稱。選項名稱必須僅包含字母數字字元、 _
或-
。
以下幾行定義了該選項的參數。當腳本運行時,這實際上被評估為 bash 程式碼。定義的變數是選項的參數。這表示適用字串的一般引用規則,並且您可以動態定義選項,如上面的範例所示,其中directory
選項的default
參數設定為$(pwd)
。
選項必須至少定義type
和variable
參數:
type
可以是flag
或option
。標誌不接受參數,而選項則接受。variable
是變數名,在該變數名下選項的參數值將在腳本中可用。選項可以定義這些其他參數:
desc
是選項的描述,用於幫助頁面。short
是單字母,用於短選項。argument
是參數型別。請參閱參數類型default
是當使用者鍵入的命令中未指定選項時該選項所採用的值。value
是指定選項但不帶參數時選項所採用的值。選項定義的變數保證在您的腳本中定義:如果bash-args找不到選項的值,它將錯誤退出。這表示如果您不指定選項的default
,則執行不帶此選項的主腳本將傳回錯誤。
換句話說,如果您不希望某個選項是必要的,請在其定義中定義default
參數。
value
參數的工作方式類似。如果您不指定它,則該選項在使用時需要一個參數。如果這樣做,則可以不帶參數地使用該選項。
標誌選項的工作方式相同,由於它們不接受參數,因此您必須定義它們的default
和value
參數。
Bash-args可以使用 Bash 完成的 API 處理腳本的自動完成。若要啟動指令的自動完成功能,請執行以下指令:
eval $( my-command.sh _register_completion )
如果該點的單字以-
開頭,製表符補全將建議定義的選項,否則建議子命令和參數。
若要告訴bash-args建議將什麼作為參數,您可以在腳本(或子命令)的Argument
資料中或在選項的argument
參數中指定參數類型。
以下是內建參數類型:
若要建立新的參數類型並將其設為自動完成,請定義一個名為_complete_my_arg_type
的函數。該函數必須可供init.sh
腳本使用,因此必須在. init.sh
行。
完成函數應該將它們的建議加入到全域COMP_REPLIES
陣列中。為了方便起見,它們將當前單字作為參數,但您也可以使用COMP_LINE
和COMP_POINT
全域變量,就像在所有 bash 補全腳本中一樣。
以下是文件參數類型的定義方式:
_complete_file () {
# $1 is the word being typed that we want to complete.
for file in " ${1-} " * ; do
# add each file to the completion candidates.
COMP_REPLIES+=( " $file " )
done
}