我在寫一個bash腳本,我需要幫助。檢查可選前綴的輸入參數
我的腳本將收到3個輸入參數。他們中的一個可能(不一定)一個-v
或-n
修改,例如:
$1="-v image"
如何檢查的說法有什麼模式?
我可以寫類似
tmp=$(echo "$1" | grep "^-v")
每個選項和每個參數,然後檢查tmp
是否爲空。但它像蠻力,我不喜歡它。你可以幫幫我嗎?
我在寫一個bash腳本,我需要幫助。檢查可選前綴的輸入參數
我的腳本將收到3個輸入參數。他們中的一個可能(不一定)一個-v
或-n
修改,例如:
$1="-v image"
如何檢查的說法有什麼模式?
我可以寫類似
tmp=$(echo "$1" | grep "^-v")
每個選項和每個參數,然後檢查tmp
是否爲空。但它像蠻力,我不喜歡它。你可以幫幫我嗎?
這應該這樣做:
#!/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"
調用這個片段banana
和chmod +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
Downvoter:請留言! –
更簡潔的選擇,使用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]}
使用'getopts'代替。 – devnull
謝謝,我不知道這件事。我認爲這會有所幫助 – user1872329
如果你的腳本被調用爲'script -v image foo bar',那麼它會收到4個參數。如果它被調用爲'script「-v圖像」foo bar「,那麼它只會得到3.你真的要求你的用戶引用他們的參數嗎? –