2013-01-21 68 views
48

我試圖讓被設計成這樣運行了一個shell腳本值:的Bash shell腳本 - 檢查標誌,並抓住其

script.sh -t application 

首先,在我的劇本我想檢查一下如果腳本已經用-t標誌運行。例如,如果它已經沒有我希望它錯誤這樣的標誌運行:

script.sh 

其次,假設有一個-t標誌,我想抓住的值,並將其存儲在一個變量,我可以在我的腳本中使用,例如像這樣:

FLAG="application" 

到目前爲止,我已經能夠做任何的這個唯一的進步是$ @抓住所有的命令行參數,但我不知道該怎麼涉及標誌,或者甚至可能。

+0

可能的複製[怎麼辦我解析在bash命令行參數?](http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash) – Jaketr00

回答

82

你應該閱讀這個getopts教程。 (!getopt = getopts

#!/bin/bash 

while getopts ":a:" opt; do 
    case $opt in 
    a) 
     echo "-a was triggered, Parameter: $OPTARG" >&2 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 

喜歡greybot說:

The external command getopt(1) is never safe to use, unless you know it is GNU getopt, you call it in a GNU-specific way, and you ensure that GETOPT_COMPATIBLE is not in the environment. Use getopts (shell builtin) instead, or simply loop over the positional parameters.

+0

這是否工作殼呢? – Jimmy

+1

'getopts'是內置了'bash',卻也有外部'getopt'程序應該與任何POSIX兼容的shell工作。 – chepner

+3

外部命令getopt的(1)從來都不是安全使用,除非你知道* *這是GNU getopt的,你把它在一個特定的GNU的方式,*和*您確保GETOPT_COMPATIBLE不在環境。改用getopts(shell builtin),或者簡單地遍歷位置參數。 –

22

使用$#搶的參數的數目,如果是不相等的

-a開關,其需要一個參數實施例到2沒有提供足夠的論據:

if [ $# -ne 2 ]; then 
    usage; 
fi 

接下來,檢查是否$1等於-t,否則使用未知標誌:

if [ "$1" != "-t" ]; then 
    usage; 
fi 

最後存儲$2FLAG

FLAG=$2 

注:usage()是表示語法的一些功能。例如:

function usage { 
    cat << EOF 
Usage: script.sh -t <application> 

Performs some activity 
EOF 
    exit 1 
} 
0

嘗試shFlags - Unix shell腳本的高級命令行標誌庫。

http://code.google.com/p/shflags/

這是非常好,非常靈活。

標記類型:這是您可以執行的DEFINE _ *的列表。所有標誌均採用 的名稱,缺省值,幫助字符串和可選的「簡短」名稱(單字母 名稱)。有些標誌還有其他的參數,用標誌來描述。

DEFINE_string:接受任何輸入,並將其解釋爲字符串。

DEFINE_boolean:通常不會採用任何參數:say --myflag將 FLAGS_myflag設置爲true,或者--nomyflag將FLAGS_myflag設置爲false。 或者,您可以說 --myflag = true或--myflag = t或--myflag = 0或 --myflag = false或--myflag = f或--myflag = 1 傳遞選項具有相同影響一次傳遞選項。

DEFINE_float:獲取輸入和intreprets它作爲一個浮點數。作爲 殼不支持每本身浮筒,輸入僅驗證爲 是一個有效的浮點值。

DEFINE_integer:獲取輸入和intreprets它作爲一個整數。

特殊標誌:有跡象表明,有特殊意義的幾個標誌: --help(或 - )打印在人類可讀的方式 --flagfile = foo的讀取富旗所有標誌的列表。 (尚未實施) - 在getopt的(),結束標誌處理

實例:

-- begin hello.sh -- 
! /bin/sh 
. ./shflags 
DEFINE_string name 'world' "somebody's name" n 
FLAGS "[email protected]" || exit $? 
eval set -- "${FLAGS_ARGV}" 
echo "Hello, ${FLAGS_name}." 
-- end hello.sh -- 

$ ./hello.sh -n Kate 
Hello, Kate. 

注:我把這個文本從shflags文檔