Как получить второе слово параметра в качестве ввода от пользователя

Вы должны добавить компонент 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
2
15.12.2019, 22:46
3 ответа

Если вы хотите прочитать два слова, используя 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].*с регулярным выражением ).

1
27.01.2020, 22:16

Не может быть (не заключенного в кавычки )пробела в …)части оператора 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
0
27.01.2020, 22:16

Вам нужно экранировать символ пробела (, как в ответ на ваш предыдущий вопрос ).

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

Связанные:

1
27.01.2020, 22:16

Теги

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