Что такое идиоматический c способ обработки ярлыка аргумента в Bash - PullRequest
0 голосов
/ 21 января 2020

Я пишу скрипт, который принимает аргументы, определяющие дальнейшее выполнение. Аргументы должны быть целыми словами (script.sh guess) и их сочетаниями (script.sh g). Закомментированная строка - первый способ, который я нашел, а вторая if - это мой более гибкий подход. В любом случае, мне интересно услышать мнения опытных людей.

Также мне интересно. Есть ли способ построить регулярное выражение так, чтобы оно занимало только g или guess, а не такие части, как gue и т. Д.

#if [[ $1 == guess || $1 == g ]]; then 
if [[ $1 =~ [guess] ]]; then
    printf "You won!"
else
    printf "You lost!"
fi

Какой ваш предпочтительный подход? Кажется, я не могу найти правильных терминов для большого G, чтобы найти ответы здесь.

Ответы [ 2 ]

5 голосов
/ 21 января 2020
case $1 in
   [Gg]|[Gg]uess) printf '%s' 'You won!';;
    *) printf '%s' 'You lost!' >&2;;
esac

Он должен соответствовать G или g и Guess или guess. хотя [Gg][Uu][Ee][Ss][Ss] может быть экстремальным, но должно работать, в bash есть также опция оболочки nocasematch.

1 голос
/ 21 января 2020

Регулярное выражение для того, что вы описываете, будет

if [[ $1 =~ g(uess)? ]]; then  # accept g or guess

Для любого префикса это будет

if [[ $1 =~ g(u(e(ss?)?)?)? ]]; then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...