我想解析shell中的一個命令,並且在其中一個選項中,如果字符串有「r」,「w」,「x」,那些,所有這些,或混合,但只有這三個。在shell中只過濾三個字符
我試圖在那裏
$2 in *r*) ;; *w*) ;; *x*) ;; * ) echo no ;;
esac
但在這種情況下,如果有書面zr
它會通過,因爲它有一個「R」的情況下。我只想讓它通過,只要它有三個中的一個,三個或兩個(任何一種組合),但沒有其他字符。
我想解析shell中的一個命令,並且在其中一個選項中,如果字符串有「r」,「w」,「x」,那些,所有這些,或混合,但只有這三個。在shell中只過濾三個字符
我試圖在那裏
$2 in *r*) ;; *w*) ;; *x*) ;; * ) echo no ;;
esac
但在這種情況下,如果有書面zr
它會通過,因爲它有一個「R」的情況下。我只想讓它通過,只要它有三個中的一個,三個或兩個(任何一種組合),但沒有其他字符。
在bash,那麼你可以使用正則表達式在本次檢查是這樣的:
re='^[rwx]+$'
s='rw'
[[ $s =~ $re ]] && echo "yes" || echo "no"
yes
s='zr'
[[ $s =~ $re ]] && echo "yes" || echo "no"
no
正則表達式^[rwx]+$
將允許1個或更多的r
或w
或x
字母。
r,w,x是權限,所以在我不想重複的情況下(如在我的程序中,用戶將要寫入權限,所以如果它寫入「wzr」,它只會使用w和r,但是如果用戶寫入「wxx」,它只會用w和x,而不是2 x(不重複)。怎麼能這樣做? –
我認爲這個要求與這個問題有很大的不同,它會更好如果你發佈一個新問題。 – anubhava
隨着延長圖案匹配在擊(shopt -s extglob
):
if [[ $var == +([rwx]) ]]; then
echo "Matches!"
else
echo "Does not match!"
fi
的+([rwx])
圖案是 「一個或多個的r
,w
或x
」。
請參考[Tour](https://stackoverflow.com/tour)並閱讀[如何提問](https://stackoverflow.com/help/how-to-ask)。 –
如果你知道正則表達式,[this](https://www.linuxjournal.com/content/bash-regular-expressions)似乎應該是你想要的。 –