bash: case и регулярные выражения
#! /bin/bash
function check_week_day {
case "$1" in
\^\[Ss\]u\(n\|nday\)\?\$ ) echo ok;;
\^\[Mm\]o\(n\|nday\)\?\$ ) echo ok;;
\^\[Tt\]u\(e\|es\|esday\)\?\$ ) echo ok;;
\^\[Ww\]e\(d\|ds\|dnesday\)\?\$ ) echo ok;;
\^\[Tt\]h\(ur\|urs\|ursday\)\?\$ ) echo ok;;
\^\[Ff\]r\(i\|iday\)\?\$ ) echo ok;;
\^\[Ss\]a\(t\|turday\)\?\$ ) echo ok;;
* )
echo "Wrong day of the week"
exit 1;;
esac
}
function check_year_number {
if [[ "$1" =~ ^[1-9]+[0-9]{,8}$ ]]; then
year=00$1
else
echo "The second argument must be a number between 1 and 999999999 (inclusive)"
fi
}
if [ "$#" -eq "1" ]; then
check_week_day $1
year=`date +%Y`
elif [ "$#" -eq "2" ]; then
check_week_day $1
check_year_number $2
else
echo "Usage: ./`basename $0` day_of_the_week [year]"
fi
}
function check_year_number {
if [[ "$1" =~ ^[1-9]+[0-9]{,8}$ ]]; then
year=00$1
else
echo "The second argument must be a number between 1 and 999999999 (inclusive)"
fi
}
if [ "$#" -eq "1" ]; then
check_week_day $1
year=`date +%Y`
elif [ "$#" -eq "2" ]; then
check_week_day $1
check_year_number $2
else
echo "Usage: ./`basename $0` day_of_the_week [year]"
fi
Имеется такая программа, которой передаются на вход 1-2 аргумента. Но 1-й аргумент которым должен быть день недели не проходит проверку что бы я не ввел:
user@user:~$ ./script.sh su
Wrong day of the week
Ответы (2 шт):
Автор решения: Vadik
→ Ссылка
Чтобы использовать расширенные регулярные выражения, включите опцию extglob в начале скрипта:
#!/usr/bin/env bash
shopt -s extglob
И перепишите case следующим образом:
case "$1" in
[Ss]u?(n|nday)) echo ok ;;
[Mm]o?(n|nday)) echo ok ;;
[Tt]u?(e|es|esday)) echo ok ;;
[Ww]e?(d|ds|dnesday)) echo ok ;;
[Tt]h?(ur|urs|ursday)) echo ok ;;
[Ff]r?(i|iday)) echo ok ;;
[Ss]a?(t|turday)) echo ok ;;
*) echo fail ;;
esac
Автор решения: Ivan
→ Ссылка
Регулярные выражения в case несколько ограничены, но есть bash regex:
$ [[ $1 =~ ^[Ss]u(n|nday)?$ ]] && echo ok
ok