2011-03-14 64 views
21

我測試,看看如果第一個給我的腳本是--foo測試在bash

if [ $# > 1 ] 
then 
    if [[ "$1" = "--foo" ]] 
    then 
     echo "foo is set" 
     foo = 1 
    fi 
fi 

if [[ -n "$foo"]] 
then 
    #dosomething 
fi 

有人能pleaset告訴我什麼是測試的bash的方式,如果--foo存在作爲一個命令行參數爭論,不一定是第一個?

+1

@Prospero:斷開鏈接 – realtebo 2018-01-28 08:56:37

回答

33

如果您想支持長期選項,您應該使用外部getopt實用程序。如果你只需要支持短期選項,最好使用Bash內建的getopts

下面是使用getopts的例子(getopt沒有太多不同):

options=':q:nd:h' 
while getopts $options option 
do 
    case $option in 
     q ) queue=$OPTARG;; 
     n ) execute=$FALSE; ret=$DRYRUN;; # do dry run 
     d ) setdate=$OPTARG; echo "Not yet implemented.";; 
     h ) error $EXIT $DRYRUN;; 
     \?) if (((err & ERROPTS) != ERROPTS)) 
       then 
        error $NOEXIT $ERROPTS "Unknown option." 
       fi;; 
     * ) error $NOEXIT $ERROARG "Missing option argument.";; 
    esac 
done 

shift $(($OPTIND - 1)) 

不是你的第一個測試總是顯示true結果,並會在當前創建一個名爲「1」的文件目錄。您應該使用(按優先順序排列):

if (($# > 1)) 

if [[ $# -gt 1 ]] 

if [ $# -gt 1 ] 

而且,對於一個任務,你不能有等號周圍的空間:

foo=1 
+0

謝謝,我轉而使用getopts。我發現我無法通過隨機搜索搜索bash,很多陷阱,必須更系統化:) – 2011-03-14 18:49:48

+0

@MK:有很多關於Bash的好問題和答案,還有幾個包括指向好地方的指南瞭解更多。 – 2011-03-14 19:18:14

9

正如丹尼斯指出的,getoptgetopts是解析命令行參數的標準方法。對於另一種方法,可以使用$ @特殊變量,該特殊變量擴展爲命令行參數的全部。所以,你可以測試使用通配符測試它:

#!/usr/bin/env bash 

if [[ [email protected] == **foo** ]] 
then 
    echo "You found foo" 
fi 

這就是說,如果你計算出的getopt宜早不宜遲,你會好起來的。

+4

有沒有必要加倍星號。這項技術可以用作快速測試,但容易出現誤報。 – 2011-03-14 19:17:16

+1

正確 - 絕對容易出現誤報。我永遠不會記得雙星號的使用位置;我的記憶在這裏失敗了。感謝您的更正! – 2011-03-15 01:37:36

+1

關於雙星號的唯一想法是使用'shopt -s globstar',zsh和ksh93進行遞歸通配的Bash 4。 – 2011-03-15 01:43:21