Существует два основных способа захвата вывода команды в сценарии оболочки: подстановка команды и чтение
встроенного модуля.
Простой способ разделить вывод на слова - это использовать встроенную в оболочку функцию разделения и поместить вывод в массив:
words=($(echo "X and Y are friends"))
echo "The ${words[5]} are ${words[1]} and ${words[3]}"
Это работает в оболочках с массивами: ksh93¹, mksh, bash, zsh. В других оболочках вы не можете хранить список слов, кроме как в позиционных параметрах.
set -- $(echo "X and Y are friends")
echo "The $5 are $1 and $3"
На самом деле, каждое слово в выводе рассматривается как шаблон подстановочного знака и заменяется списком подходящих файлов, если таковые имеются. (За исключением zsh, который делает это только при явном указании, если только не в режиме совместимости с sh). Например, если одним из слов является *
, оно будет заменено списком файлов в текущем каталоге. Чтобы избежать этого, отключите согласование подстановочных знаков:
set -f
words=($(echo "* and / are punctuation"))
echo "Here's some ${words[5]}: ${words[1]} and ${words[3]}"
set +f
С помощью read
вы можете назначить отдельные слова переменной. Сложность read
в том, что поскольку она читает из стандартного ввода, ее часто используют в качестве правой стороны в трубе; но в большинстве оболочек (за исключением ATT ksh и zsh) обе стороны трубы работают в под-оболочке, поэтому назначения переменных теряются за пределами трубы. Вы можете поместить read
как часть последовательности инструкций.
echo "X and Y are friends" | {
read -r first conjunction second verb complement remainder
echo "The $complement are $first and $second"
}
Альтернативно, в ksh93, bash или zsh, вы можете передать ввод в подстановке процесса.
read -r first conjunction second verb complement remainder <(echo "X and Y are friends")
echo "The $complement are $first and $second"
Если вы хотите хранить слова в массиве, вы можете использовать read -rA words
в mksh, ksh93 и zsh, или read -ra words
в bash, например, в bash
read -ra words <(echo "X and Y are friends")
эквивалентно
set -f; words=$((echo "X and Y are friends")); set +f
если команда выводит одну строку, за исключением того, что она не сбрасывает опцию -f
, если она была включена ранее.
¹ В Ksh88 есть массивы, но присвоение использует другой синтаксис.
Сначала нужно выполнить pacman -Syu
, затемpacman -S postgresql
Причина, по которой возникает ошибка такого типа, заключается в том, что в pacman нет списка доступных пакетов. pacman -Syu
обновит (или создаст )список доступных пакетов, а затем обновит уже установленные пакеты.
Перед установкой вы можете использовать pacman -Ss postgresql
для просмотра списка пакетов, соответствующих вашему вводу, это поможет вам выяснить, какие пакеты вам нужны.
Для получения более подробного списка возможностей pacman прочитайте сообщение Archwiki о pacman