Использовать 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
Ваш 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 ']'
Надо надеяться, это дает Вам некоторое понимание:
Вас можно было бы оставить, задавшись вопросом почему 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
Это теперь работает как ожидалось!
замена
istouch='xsetwacom --get 15 touch'
$istouch
с (отмечают одинарные левые кавычки):
istouch=`xsetwacom --get 15 touch`