
Я хочу проверить, является ли строка, записанная в переменную в bash через команду read, кортежем из двух чисел. Насколько мне известно, это должно быть возможно с помощью
if [[ "$input" =~ "$regex" ]]; then ...
для кортежа из двух чисел, разделенных как минимум одним пробелом и любым количеством пробелов до и после, я попробовал
$regex="^ *[0-9]+ +[0-9]+ *$"
который должен соответствовать
12 123
23 3246543
123 345
34 23
1 234
но нет
123 123 123
1235124
123w123 123
etc.
Однако это не работает...
решение1
POSIXФункция скрипта оболочки, использует расширение параметра для получения первого и второго числа, -eq
успешно выполняется только в том случае, если есть два аргумента, которые являются одинаковыми числами (и не выполняется, если аргументов меньше или больше, или если какой-либо из них содержит буквы), и !=
для проверки пробела. Возвращаетистинныйтолько если это кортеж из двух чисел:
is_tup() { [ ${1% *} -eq ${1% *} -a \
${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }
Тест:
echo '12 123
23 3246543
123 345
34 23
1 234
123 123 123
1235124
123w123 123' |
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done
Выход:
yes 12 123
yes 23 3246543
yes 123 345
yes 34 23
yes 1 234
no 123 123 123
no 1235124
no 123w123 123