(Иллинойс) оператор Logical

Использовать echo отобразить сообщение, и read считать строку входа. Это оболочка builtins, поэтому консультируйтесь с руководством своей оболочки для получения дополнительной информации.

echo "What is your name?"
read -r name
echo "What is your age?"
read -r age

Для проверки возраста проверьте, содержит ли он символы кроме цифры. Единственная портативная встроенная конструкция оболочки, которая позволяет это, case (некоторые оболочки имеют расширения для соответствия regexp).

case $age in
  *[!0-9]*) echo 1>&2 "Your age must consist of digits only."; exit 2;;
esac

Для проверки имени проверьте, содержит ли оно непечатаемые символы. (Обратите внимание, что имена могут содержать в значительной степени произвольные символы; также, не у всех есть “фамилия”: рассматривайте имя как произвольную строку.)

case $name in
  *[![:print:]]*) echo 1>&2 "Your name must consist of printable characters only."; exit 2;;
esac

1
24.09.2013, 05:55
2 ответа

Ваш if statments не выполняют способ, которым Вы думаете. Можно поднять отладку для сценариев Bash как это включением команды set -x и впоследствии выключите его с set +x.

Пример

Таким образом, мы сначала добавляем отладку как так:

#!/bin/bash

## DEBUG
set -x
xsetwacom --set 16 touch False
....

Я затем запускаю Ваш скрипт, я назвал его ex.bash, таким образом, я вызываю его:

$ ./ex.bash

Bash пытается выполнить эту строку:

if [ "$istouch"=="off" ]

И от вывода, мы видим, что Bash запутывается. Это работает со строкой 'xsetwacom --get 15 touch==off'.

+ '[' 'xsetwacom --get 15 touch==off' ']'

Аргументы == не должен касаться его как этот. Bash известно придирчив на вещах как это. Так помещает некоторое пространство прежде и после как это:

 if [ "$istouch" == "off" ]
 elif [ "$istouch" == "on" ]

Таким образом, теперь это выглядит немного лучше:

+ '[' 'xsetwacom --get 15 touch' == off ']'
+ '[' 'xsetwacom --get 15 touch' == on ']'

Однако Вы не хотите сравнивать строку $istouch, Вы хотите сравнить результаты команды, которую представляет эта строка, так измените верхнюю часть сценария к этому:

....
xsetwacom --set 16 touch False
istouch=$(xsetwacom --get 15 touch)
if [ "$istouch" == "off" ]
....

Теперь мы выполняем команду xsetwacom и хранение результатов в $istouch. У меня нет этих устройств, таким образом, я получаю сообщение о device 15. Но это - то, что сценарий делает теперь:

++ xsetwacom --get 15 touch
+ istouch='Cannot find device '\''15'\''.'
+ '[' 'Cannot find device '\''15'\''.' == off ']'
+ '[' 'Cannot find device '\''15'\''.' == on ']'

Надо надеяться, это дает Вам некоторое понимание:

  1. Как отладить Ваш сценарий
  2. Лучше понимание синтаксиса Bash

Больше всестороннего взгляда на, если операторы

Вас можно было бы оставить, задавшись вопросом почему if оператор даже подобран вообще. Проблема - это, если Вы даете [ управляйте единственной строкой, она будет рассматривать это как истину, если строка не будет пуста, и, если оператор упадет в then раздел.

Пример

$ [ "no"=="yes" ] && echo "they match"
they match

$ [ "notheydont"=="yes" ] && echo "they match"
they match

Может казаться, что существует проверка равенства, происходящая здесь, но нет. [ some-string ] коротко для [ -n some-string ], это - тест для некоторой-строки, являющейся [n] на-пустом. Используя set -x показывает нам это:

$ set -x; [ "notheydont"=="yes" ] && echo "they match"; set +x
+ '[' notheydont==yes ']'
+ echo 'they match'
they match
+ set +x

Если мы помещаем некоторое пространство между аргументами проверке равенства:

# fails
$ set -x; [ "notheydont" == "yes" ] && echo "they match"; set +x
+ '[' notheydont == yes ']'
+ set +x

# passes
$ set -x; [ "yes" == "yes" ] && echo "they match"; set +x
+ set -x
+ '[' yes == yes ']'
+ echo 'they match'
they match
+ set +x

Это теперь работает как ожидалось!

5
27.01.2020, 23:17
  • 1
    Ahh, большое спасибо, он помогает мне много знать о-x функции. Однако одна вещь, которую я не понимаю, состоит в том, что в моей версии сценария это (правильно) зеркально отразило бы экран в режим планшета каждый раз, когда я выполняю его в первый раз. Почему сделал "$istouch" == "от" результата к Истинному? –  Timidger 24.09.2013, 06:32
  • 2
    @Timidger Видит обновления. –  slm♦ 24.09.2013, 06:42
  • 3
    @StephaneChazelas - благодарит за исправления! –  slm♦ 24.09.2013, 14:28

замена

istouch='xsetwacom --get 15 touch'
$istouch

с (отмечают одинарные левые кавычки):

istouch=`xsetwacom --get 15 touch`
0
27.01.2020, 23:17

Теги

Похожие вопросы