2017-03-15 68 views
0

所以在我的代碼結構的這樣如何打印到終端,如果沒有標誌存在

USAGE="Usage: ./MyProject.sh [-o <output-file>] <guests>" 

其中-o是一個標誌選項,使我們能夠在客人名字的文件名打印。 例如我插入到終端中

實施例1

./MyProject.sh -o GuestNames list 

這個程序應該創建一個文件名爲GuestNames和存儲無論是在在列表轉換GuestNames的文件名。但是,如果我輸入下列指令

例2:

./MyProject.sh -o list 

應該只是打印的人下列名稱列表到終端。

我已經有了代碼(例如它可以檢測文件名列表等),我遇到麻煩的是將它從終端打印出來,如果沒有如示例2所示的標誌存在。

這裏是我的代碼:

outfile= #default: print to stdout 
function user{ 
while getopts ":o:" arg; do 
case $arg in 
o) outfile=$OPTARG #tests the outfile to see if there is a flag 
    ;; 
#Other cases and more code below but won't effect anything 
} 

if (outfile= $OPTARG); then 
$OPTARG > $outfile 
print_guests >$outfile #added for the guests to be print 
else 
print_guests #function that converts the list into an array and prints out guests 
fi 

我得到的錯誤是「$ OUTFILE:曖昧重定向」,因爲我認爲它試圖直接外野到一個空字符串,而不是試圖打印到終端。如果你可以請幫助我,我會感激它!

+0

哇我多麼愚蠢,謝謝你 – Bob

+0

當你第一次在bash腳本中遇到問題時,一般的經驗法則是,在腳本的頂部放置-xv(在shebang之後),你將得到設置了哪些變量以及執行了哪些命令。你也可以使用shellcheck.net來檢查你的腳本,因爲在你遇到的問題之外有什麼錯誤:) – grail

回答

0

因此,您正在使用全局變量outfile來存儲要寫入的文件的路徑。您使用getopts的方式看起來大多是正確的,您只需使用更合適的測試來確定是寫入標準輸出還是寫入文件。這裏有一個例子:

outfile= #default: print to stdout 
function parse_args { 
    while getopts ":o:" arg; do 
     case $arg in 
      o) outfile=$OPTARG 
      ;; 
     esac 
    done 
} 

parse_args "[email protected]" 

if [ -n "$outfile" ]; then 
    print_guests > "$outfile" #added for the guests to be print 
else 
    print_guests 
fi 

這一點也很重要,以確保您使用"[email protected]"到腳本參數傳遞給您的參數解析功能。

+0

Omg謝謝你!你是一個拯救生命的人! – Bob

+0

而不是有兩個不同的行來調用print_guests,你可能會考慮:'if [-n「$ outfile」];然後exec>「$ outfile」;網絡連接; print_guests',或者類似'if [-z「$ outfile」];那麼outfile =/dev/stdout;網絡連接; print_guests'(第一個更好)。 –

+0

好點。圍繞我的文件描述符移動是我傾向於避免做的事情,除非它在子外殼內。 –