2011-07-26 49 views
3

有人可以向我展示如何正確使用getopts或其他任何可以在參數中傳遞的技巧的示例?我正在嘗試在unix shell/bash中編寫它。我看到有getopt和getopts,不確定哪個更好用。最終,我會爲此增加更多選項。如何使用getopt(s)作爲在bash中傳遞參數的技巧

在這種情況下,我想將文件路徑作爲輸入傳遞給shell腳本,並在未正確輸入的情況下放置描述。

export TARGET_DIR="$filepath" 

例如:(在命令行上調用)

./mytest.sh -d /home/dev/inputfiles 

錯誤味精或提示正確用法如果運行這種方式:

./mytest.sh -d /home/dev/inputfiles/ 
+0

您可以特別測試以查看該文件夾是否有尾部斜線,是否存在,以及它是否是文件夾 - 所有與您的參數解析方法無關 – lunixbochs

回答

6

作爲用戶,我會非常惱火的一個程序,給我一個錯誤的提供一個尾部斜槓的目錄名稱。如有必要,您可以將其刪除。

有相當完整的錯誤檢查的殼例如:

#!/bin/sh 

usage() { 
    echo "usage: $0 -d dir_name" 
    echo any other helpful text 
} 

dirname="" 
while getopts ":hd:" option; do 
    case "$option" in 
    d) dirname="$OPTARG" ;; 
    h) # it's always useful to provide some help 
     usage 
     exit 0 
     ;; 
    :) echo "Error: -$OPTARG requires an argument" 
     usage 
     exit 1 
     ;; 
    ?) echo "Error: unknown option -$OPTARG" 
     usage 
     exit 1 
     ;; 
    esac 
done  

if [ -z "$dirname" ]; then 
    echo "Error: you must specify a directory name using -d" 
    usage 
    exit 1 
fi 

if [ ! -d "$dirname" ]; then 
    echo "Error: the dir_name argument must be a directory 
    exit 1 
fi 

# strip any trailing slash from the dir_name value 
dirname="${dirname%/}" 

對於getopts的文檔,看在bash manual

+0

不錯的示例。謝謝。 – jdamae

+0

謝謝。起初它沒有工作,但我有我的getopts邏輯在一個功能,而不是在主體 – asgoth

0

更正了 ':)' 行:

:) echo "Error: -$OPTARG requires an argument" 

,因爲如果在該標誌後沒有提供任何值,則OPTARG獲得標誌的名稱並將標誌設置爲在上述示例中打印的「:」:

Error: -: requires an argument 

這是沒有用的信息。

同樣適用於:

\?) echo "Error: unknown option -$OPTARG" 

感謝這個樣!