Вы должны добавить компонент non-free
в свойsources.list
отредактируйте свой sources.list
sudo apt edit-sources
следующим образом:
deb http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch main contrib non-free
deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free
deb http://security.debian.org/ stretch/updates main contrib non-free
deb-src http://security.debian.org/ stretch/updates main contrib non-free
сохранить и запустить:
sudo dpkg --add-architecture i386
sudo apt update
sudo apt install steamcmd
Проверить упаковку:
$ apt-cache search steamcmd
steamcmd - Command-line interface for Valve's Steam
$apt-cache policy steamcmd
steamcmd:i386:
Installé : (aucun)
Candidat : 0~20130205-1
Table de version :
0~20130205-1 500
500 http://deb.debian.org/debian stretch/non-free i386 Packages
Если вы хотите прочитать два слова, используя read
, используйте две переменные:
read -r -p 'Enter "-a" or "-s <word>": ' opt word
case $opt in
-a)
echo 'You picked "-a"'
;;
-s)
printf 'You picked "-s" with the word "%s"\n' "$word"
;;
*)
echo 'You picked neither "-a" nor "-s <word>"'
esac
Причина, по которой ваш код не работает, заключается в том, что вы используете расширенное регулярное выражение в качестве шаблона(-s [a-z]+
). Шаблоны, используемые оператором case
, являются шаблонами подстановки имен файлов. Они похожи, но не одинаковы. Шаблон подстановки не позволяет использовать тот же вид «модификатора повторения», который используется в шаблоне регулярного выражения (и+
).
С шаблоном подстановки вы сможете использовать '-s '[a-z]*
, т.е. "строку -s
, за которой следует строчная буква, а затем что-то " (то же, что и ^-s [a-z].*
с регулярным выражением ).
Не может быть (не заключенного в кавычки )пробела в …)
части оператора case.
Значит, нужно цитировать :\
, " "
или' '
:
Кроме того, сопоставление операторов case выполняется с помощью шаблонов, а не регулярных выражений. В Сопоставление с образцом нет +
, есть только *
, но это не означает повторение последнего элемента, а просто "любой символ в любом количестве". Я предполагаю, что ваш [a-z]+
предназначался для соответствия слову, состоящему только из строчных букв. Невозможно написать то же самое в более простых строках сопоставления с образцом. Что можно сделать, так это:
read -rp 'choose: ' choice
case $choice in
-a) echo "you chose a";;
-s\ *[^a-z]*) echo "not a valid word selected";;
-s\ *) echo "you chose the word ${choice#"-s "}";;
*) echo "no choice made";;
esac
Вам нужно экранировать символ пробела (, как в ответ на ваш предыдущий вопрос ).
Bash интерпретирует +
как литерал +
, а не как «одно или несколько вхождений». Баша операторы сопоставления с образцом отличаются от регулярных выражений. Чтобы сопоставить одно или несколько вхождений, вы можете включить опцию оболочки «расширенная подстановка» extglob
и использовать шаблон +(...)
.
Чтобы убедиться, что выражение диапазона [a-z]
соответствует только строчным буквам (, это может зависеть от настройки LC_COLLATE
или LC_ALL
вашей локали ), вы также можете включить параметр оболочки globasciiranges
.
shopt -s extglob
shopt -s globasciiranges
read -rp 'choose: ' choice
case $choice in
-a)
echo "you chose a"
;;
-s\ +([a-z]))
echo "you chose the word \"${choice#-s }\""
;;
*) echo "unknown choice \"$choice\""
esac
Связанные: