2014-09-13 94 views
2

我已經看到了如何使用getopts例子很多。但是我知道bash的基本知識,而且我無法在我的情況下實施它。我真的很感激,如果有人能告訴我模板。如何在bash中使用getopts來解析腳本參數?

我有一個腳本,至少有和最大輸入。這裏是一個簡要說明:

script.sh -P passDir -S shadowDir -G groupDir -p password -s shadow 

用戶必須爲-P -S -G提供參數,如果不是我必須顯示的使用和關閉程序。如果提供參數,我需要將它們保存到適當的變量中。

-p-s是可選的。然而,如果沒有-p我應該做一些任務,如果沒有-s我應該做一些其他任務,如果沒有他們的存在是我應該做一些其他任務。 下面是我到目前爲止寫,但在for循環它的股票。

#!/bin/bash 

if [ "$(id -u)" != "0" ]; then 
    echo "Only root may add a user to system" 
    exit 2 
else 
    usage() { echo "Usage: $0 [-P <password file path>] [-S <shadow file path>] [-G <group path>]" 1>&2; exit 1; } 
    passDir="" 
    shadowDir="" 
    groupDir="" 
    while getopts ":P:S:G:" inp; do 
     case "${inp}" in 
      P) 
       $passDir = ${OPTARG};; 
      S) 
       $shadowDir = ${OPTARG};; 
      G) 
       $groupDir = ${OPTARG};; 
      *) 
       usage;; 

     esac 
    done 

    echo "${passDir}" 
    echo "${shadowDir}" 
    echo "g = ${groupDir}" 
fi 

此刻用戶不輸入參數什麼都不會顯示,如果有參數它會進入一個循環!

回答

3

據我所知,你只是缺少一些if語句來處理缺少參數。考慮:

usage() { echo "Usage: $0 [-P <password file path>] [-S <shadow file path>] [-G <group path>]" 1>&2; exit 1; } 

if [ "$(id -u)" != "0" ]; then 
    echo "Only root may add a user to system" 
    exit 2 
fi 
passDir="" 
shadowDir="" 
groupDir="" 
while getopts "P:S:G:" inp; do_ 
    case "${inp}" in 
     P) 
      passDir=${OPTARG};; 
     S) 
      shadowDir=${OPTARG};; 
     G) 
      groupDir=${OPTARG};; 
     *) 
      usage;; 
    esac 
done 

if [ -z "$passDir" ] && [ -z "$shadowDir" ] 
then 
    # if none of them is there I should do some other tasks 
    echo do some other tasks 
elif ! [ "$passDir" ] 
then 
    # if there is no -p I should do some tasks_ 
    echo do some tasks 
elif ! [ "$shadowDir" ] 
then 
    #if there is no -s I should do some other tasks 
    echo do some other tasks 
fi 
2

我固定的幾件事情在你的腳本。這個工作對我來說:

#!/bin/bash 

if [ "$(id -u)" != "0" ]; then 
    echo "Only root may add a user to system" 
    exit 2 
fi 

usage() { echo "Usage: $0 [-P <password file path>] [-S <shadow file path>] [-G <group path>]" 1>&2 
    exit 1 
} 

passDir="" 
shadowDir="" 
groupDir="" 
while getopts ":P:S:G:" inp; do 
    case "${inp}" in 
     P) 
      passDir=${OPTARG};; 
     S) 
      shadowDir=${OPTARG};; 
     G) 
      groupDir=${OPTARG};; 
     *) 
      usage;; 

    esac 
done 

echo "p = $passDir" 
echo "s = $shadowDir" 
echo "g = $groupDir" 
  • 分配不能包含空格:a=1作品,a = 1
  • 變量名稱不應該用$在分配前綴
  • 如果您if分支包含exit聲明,則不需要將其餘代碼放在else分支中
+0

感謝您的回答。我很感激。我選擇了其他答案作爲解決方案,因爲它解釋了-s和-p的解決方案並未提供。再次感謝 – Bernard 2014-09-13 18:42:38

+1

@Bernard:現在你必須添加'-p密碼'和'-s陰影'的例子。不要忘記寫一個有用的使用信息。 – 2014-09-13 23:02:01