2014-04-20 16 views
1

我在寫一個bash腳本,我需要幫助。檢查可選前綴的輸入參數

我的腳本將收到3個輸入參數。他們中的一個可能(不一定)一個-v-n修改,例如:

$1="-v image" 

如何檢查的說法有什麼模式?

我可以寫類似

tmp=$(echo "$1" | grep "^-v") 

每個選項和每個參數,然後檢查tmp是否爲空。但它像蠻力,我不喜歡它。你可以幫幫我嗎?

+4

使用'getopts'代替。 – devnull

+0

謝謝,我不知道這件事。我認爲這會有所幫助 – user1872329

+1

如果你的腳本被調用爲'script -v image foo bar',那麼它會收到4個參數。如果它被調用爲'script「-v圖像」foo bar「,那麼它只會得到3.你真的要求你的用戶引用他們的參數嗎? –

回答

1

這應該這樣做:

#!/bin/bash 
shopt -s extglob 
case $1 in 
    (-v\ *) arg=${1#-v+([[:space:]])}; mod=v ;; 
    (-n\ *) arg=${1#-n+([[:space:]])}; mod=n ;; 
    (*) arg=$1; mod=;; 
esac 
echo "mod: $mod" 
echo "arg: $arg" 

調用這個片段bananachmod +x banana。然後:

$ ./banana '-v image' 
mod: v 
arg: image 
$ ./banana '-n image' 
mod: n 
arg: image 
$ ./banana 'image-v' 
mod: 
arg: image-v 
$ ./banana '-vimage' 
mod: 
arg: -vimage 
+0

Downvoter:請留言! –

0

更簡潔的選擇,使用bash的正則表達式匹配操作,=~

# Assumes that $1 is the argument of interest and that it contains something like 
# '-n val', '-v val', or 'val'; $mode will receive the option letter only, if any. 
mode='' arg=$1 
[[ $1 =~ ^-([vn])\ *(.*)$ ]] && mode=${BASH_REMATCH[1]} arg=${BASH_REMATCH[2]}