2014-09-03 74 views
0

我是shell腳本的新手。我編寫了一個腳本,其中包含零個或多個選項以及一個可選的路徑參數。如果未設置路徑參數,我想使用當前目錄。如何檢測參數是否傳遞給腳本?

這是腳本的參數分析部:

OPTIONS=$(getopt -o dhlv -l drop-databases,help,learner-portal,verifier-portal -- "[email protected]") 

if [ $? -ne 0 ]; then 
    echo "getopt error" 
    exit 1 
fi 

eval set -- $OPTIONS 

while true; do 
    case "$1" in 
    -d|--drop-databases) RESETDB=1 
          ;; 
    -h|--help)   echo "$usage" 
          exit 
          ;; 
    -l|--learner-portal) LERPOR=1 
          ;; 
    -v|--verifier-portal) VERPOR=1 
          ;; 
    --)     shift 
          break;; 
    *)     echo -e "\e[31munknown option: $1\e[0m" 
          echo "$usage" 
          exit 1 
          ;; 
    esac 
    shift 
done 

# Set directory of module 
if [[ -n $BASH_ARGV ]] 
then 
    MOD_DIR=$(readlink -f $BASH_ARGV) 
fi 

if [[ -n $MOD_DIR ]] 
then 
    cd $MOD_DIR 
fi 

該腳本按預期正常運行時調用不和論據,或當這兩個選項和路徑調用。

然而,當我運行該腳本,只有指定的選項,我得到的readlink像這樣

$ rebuild_module -dv 
readlink: invalid option -- 'd' 
Try 'readlink --help' for more information. 

顯然,這是解析選項正確的錯誤,但我不知道如何檢測,我沒有通過路徑,因此避免調用readlink。我該如何去糾正這種行爲?

+0

-dv正常工作。任何標誌組合都可以工作。 – evanjdooner 2014-09-03 13:02:27

+0

謝謝埃文,我沒有仔細觀察。 – 2014-09-03 13:14:46

回答

1

您可以使用[ $# -ne 0 ]而不是[[ -n $BASH_ARGV ]]。前者受shift/set影響,但後者不是:

$ cat test.sh 
echo "$#" 
echo "${BASH_ARGV[@]}" 
echo "[email protected]"  
eval set -- foo bar 
shift 
echo "$#" 
echo "${BASH_ARGV[@]}" 
echo "[email protected]" 
$ bash test.sh x y z 
3 
z y x 
x y z 
1 
z y x 
bar 
+0

就是這樣!謝謝!我想,我需要更好地瞭解bash變量和內置插件。 – evanjdooner 2014-09-03 13:08:16