2017-01-09 5 views
1

Я пытаюсь разобрать команду в оболочке и в одном из параметров, которые я хочу сохранить в переменной, если строка имеет «r», «w», «x», одну из те, все они, или смесь, но только эти три.Отфильтровать только три символа в оболочке

Я попробовал случай, когда

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

Но в этом случае, если там написано zr он будет проходить, так как она имеет «г». Я только хочу, чтобы он прошел, пока у него есть один из этих трех, три из них или два из них (любая комбинация), но никаких других персонажей.

+1

Прочтите [Tour] (https://stackoverflow.com/tour) и прочитайте [How To Ask] (https://stackoverflow.com/help/how-to-ask). –

+0

Если вы знаете о регулярных выражениях, [это] (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 

Regex ^[rwx]+$ позволит 1 или более r или w или x букв.

+0

r, w, x - разрешения, поэтому в случае, если я не хочу повторения (как в моей программе, пользователь будет писать разрешения, поэтому, если он пишет «wzr», он будет принимать только w и r, но если пользователь пишет «wxx», он будет принимать только w и x, но не 2 x (без повторения). Как это можно сделать? –

+0

Я думаю, что это требование сильно отличается от этого вопроса. если вы разместите новый вопрос. – anubhava

0

С расширенным сопоставлением с образцом в Bash (shopt -s extglob):

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

+([rwx]) картина "один или более из r, w или x".