2011-11-17 69 views
1

我想解析一個bash腳本中的選項。如何使用getopts來查看是否已輸入可選標誌。分析bash腳本中的參數/選項/標誌

FILE1=$1 
FILE2=$2 
outputfile='' 
while getopts "o" OPTION 
do 
    case $OPTION in 
    o) 
     outputfile=$OPTARG 
    ;; 
    esac 
done 
if [ ! $outputfile -eq '' ] 
then 
    cat $FILE1 | paste - | $FILE1 - | tr "\t" "\n" | paste $FILE1 $FILE2 | tr '\t' '\n' > $outputfile 

else 
    cat $FILE1 | paste - | $FILE1 - | tr "\t" "\n" 
    paste $FILE1 $FILE2 | tr '\t' '\n' 
fi 

回答

6

這裏有很多問題。您需要首先解析選項(getopts循環),然後將它們從參數列表(shift $(($OPTIND-1))),然後從$ 1和$ 2中獲取FILE1和FILE2。其次,你需要告訴getopts -o接受一個參數(getopts "o:")。第三,你的getopts循環應該包括檢查一個無效的選項(你也應該確保FILE1和FILE2都被指定)。第四,在檢查$ outputfile是否爲空時,你需要用雙引號括起來,然後使用字符串測試(-eq檢查數值是否相等,如果使用它來比較除數字以外的任何內容,則會發出錯誤)。第五,如果文件名中有任何有趣的字符,你應該在文件名周圍加雙引號。最後,你試圖執行的實際命令(粘貼,tr等)沒有意義(所以我幾乎不管它們)。這是我的重寫:

#!/bin/sh 
outputfile='' 
while getopts "o:" OPTION 
do 
    case $OPTION in 
    o) 
     outputfile="$OPTARG" 
    ;; 
    [?]) 
     echo "Usage: $0 [-o outfile] file1 file2" >&2 
     exit 1 
    ;; 
    esac 
done 
shift $(($OPTIND-1)) 

if [ $# -ne 2 ]; then 
    echo "Usage: $0 [-o outfile] file1 file2" >&2 
    exit 1 
fi 
FILE1="$1" 
FILE2="$2" 

if [ -n "$outputfile" ]; then 
    cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n" | paste "$FILE1" "$FILE2" | tr '\t' '\n' > "$outputfile" 
else 
    cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n" 
    paste "$FILE1" "$FILE2" | tr '\t' '\n' 
fi 
+0

非常感謝我對bash編程非常陌生。當我運行這個程序並且說./test file1 file2它打印正確的輸出,但是首先說找不到file1,如果我使用./test -o hello file1 file2它說file1找不到。 – BillPull

+1

'... | 「$ FILE1」 - | ...'部分嘗試執行$ FILE1作爲命令,它會給你一個「找不到命令」的錯誤。這就是我說這部分沒有多大意義的原因之一。 –