until printf 'Please enter 1 or 2: ' IFS= read -r line || exit # exit on EOF [ "$line" = 1 ] || [ "$line" = 2 ] do printf >&2 '"%s" is neither 1 nor 2, try again.\n' "$line" done
С
IFS =
и-r
входная строка сохраняется как есть в$ линия
.Вы можете опуститьIFS =
, чтобы пробелы (при условии, что вы не изменили$ IFS
) автоматически удалялись из начала или конца ввода.Если на входе должны быть только строки
1
или2
, тогда вы хотите использовать=
, а не-eq
.Если вы хотите разрешить другие выражения
1
или2
чисел , например01
,1 + 1
,1.0
,100e-2
,exp (0)
,RANDOM
(иногда), тогда вы можете использовать-eq
, но обратите внимание, что не все оболочки принимают все типы выражений выше (ksh93
примет их все, ноbash
будет принимать только такие вещи, как1
( начальные и / или конечные пробелы) или0001
(начальные нули)), и это означает, что вы получите сообщения об ошибках для входных данных, которые не образуют допустимые арифметические выражения.С оболочками, которые интерпретируют арифметические выражения, это также опасно, так как они могут изменять значения переменных (например, для ввода типа
PATH = 123
) или даже запускать произвольные команды (например, для ввода типаa [ 0 $ (cmd> & 2)]
).В зависимости от оболочки, вы также можете получить ложные срабатывания на 18446744073709551617 или 4294967297 (или любое другое число, кратное 2 32 или 2 64 + 1 или 2), поскольку большинство оболочек используют 64-битные или 32-битные целые числа.
Что бы вы ни делали, не используйте
-o
и-a
двоичныйтест
/[
операторы. Их следует удалить, так как они делают синтаксический анализ команды[
потенциально неоднозначным и на практике ненадежным (и теперь помечены устаревшими в спецификации POSIX) .Например:
$ line='!' sh -c '[ "$line" = 1 -o "$line" = 2 ]' sh: line 0: [: too many arguments
И не забудьте заключить в кавычки ваши переменные (
"$ line"
, а не$ line
, которые будут подвергаться split + glob).
Похоже, AMD Ryzen 7 2700U + Vega 10 не поддерживается ядрами Linux до версии 4.10, а стабильная версия Debian и Devuan работает на ядре 4.9.
Для этого процессора AMD предлагаются ядра 4.18 и новее.
https://lists.debian.org/debian-user/2017/03/msg00063.html
https://github.com/M-Bab/linux-kernel-amdgpu-binaries
Debian и мой новый AMD Ryzen 2700U (Vega 10 )не дружат
https://www.reddit.com/r/Amd/comments/8snkup/most_stable_gnulinux_distro_for_a_ryzen_cpu/
https://www.reddit.com/r/debian/comments/8hwts3/is_it_possible_to_install_debian_on_amd_ryzen/
https://www.claudiokuenzler.com/blog/819/linux-going-amd-ryzen-cpu-debian-strech-9
П.С. :Новое ядро не решило мою проблему. См. здесь:Не удается запустить/установить Linux на ThinkPad E585