2017-01-09 32 views
1

我想解析shell中的一個命令,並且在其中一個選項中,如果字符串有「r」,「w」,「x」,那些,所有這些,或混合,但只有這三個。在shell中只過濾三個字符

我試圖在那裏

$2 in *r*) ;; *w*) ;; *x*) ;; * ) echo no ;; 
esac 

但在這種情況下,如果有書面zr它會通過,因爲它有一個「R」的情況下。我只想讓它通過,只要它有三個中的一個,三個或兩個(任何一種組合),但沒有其他字符。

+1

請參考[Tour](https://stackoverflow.com/tour)並閱讀[如何提問](https://stackoverflow.com/help/how-to-ask)。 –

+0

如果你知道正則表達式,[this](https://www.linuxjournal.com/content/bash-regular-expressions)似乎應該是你想要的。 –

回答

1

在bash,那麼你可以使用正則表達式在本次檢查是這樣的:

re='^[rwx]+$' 

s='rw' 
[[ $s =~ $re ]] && echo "yes" || echo "no" 
yes 

s='zr' 
[[ $s =~ $re ]] && echo "yes" || echo "no" 
no 

正則表達式^[rwx]+$將允許1個或更多的rwx字母。

+0

r,w,x是權限,所以在我不想重複的情況下(如在我的程序中,用戶將要寫入權限,所以如果它寫入「wzr」,它只會使用w和r,但是如果用戶寫入「wxx」,它只會用w和x,而不是2 x(不重複)。怎麼能這樣做? –

+0

我認爲這個要求與這個問題有很大的不同,它會更好如果你發佈一個新問題。 – anubhava

0

隨着延長圖案匹配在擊(shopt -s extglob):

if [[ $var == +([rwx]) ]]; then 
    echo "Matches!" 
else 
    echo "Does not match!" 
fi 

+([rwx])圖案是 「一個或多個的rwx」。