Проблема с `echo` в bash при циклическом просмотре вывода скрипта Python

Когда вы добавляете репозиторий ppa к источникам программного обеспечения, вы также должны добавить ключ GPG этого репозитория.

Если вы этого не сделаете, программа обновления ПО ()запросит разрешение на установку любых пакетов из репозитория ppa, используя этот «страшный» диалог. Без ключа GPG программное обеспечение не может доверять репозиторию.

См. это, чтобы узнать, как добавить ключ GPG репозитория:https://askubuntu.com/questions/291035/how-to-add-a-gpg-key-to-the-apt-sources-keyring

0
27.07.2019, 09:19
2 ответа

Похоже, declare -a choice=$( python3 test.py )создает массив из 1 длины, где

choice[0]='first
second
third'

Попробуйтеdeclare -a choice=( $( python3 test.py ) )

3
28.01.2020, 02:14

Сценарий Python печатает три строки текста. Чтобы прочитать их в массив в bash, используйтеreadarray:

readarray -t chose < <( python3 test.py )
printf '> %s\n' "${chose[@]}"

Команда readarray -tбудет считывать строки в заданный массив из стандартного ввода. Стандартный ввод перенаправляется из вашего скрипта Python с помощью подстановки процесса. Утилита readarrayпо умолчанию считывает отдельные строки, т. е. строки текста, заканчивающиеся символом новой строки, а параметр -tзаставляет утилиту удалять завершающий символ новой строки из считываемых данных.

Вызов printfвыводит каждый элемент массива с начальным >и пробелом. Передавая несколько аргументов printf, что вы делаете, предоставляя ему расширение массива, подобного этому, он будет повторно использовать свою строку форматирования для вывода каждого отдельного аргумента. Это означает, что нет необходимости в цикле.


Проблема с вашим скриптом заключается в том, что вы читаете вывод из вашего скрипта Python в одну строку. Подстановка команды $( python3 test.py )будет расширена до строки, которую вам затем придется вручную анализировать и разбивать на новые строки на правильные элементы массива.

Вы можете сделать , как предлагает Dabombber , и позволить оболочке сделать это разделение за вас с помощьюchoice=( $( python test.py ) )(declare -aне требуется ), но учтите, что это разделит строку на . ] любые пробелы (пробелы, табуляции и новые строки (содержимое$IFS)по умолчанию ), что может быть не тем, что вам нужно, если вы хотите, чтобы ваши отдельные элементы массива включали пробелы.

Тогда можно было бы установить IFSна новую строку, чтобы оболочка разделяла данные на новые строки только или считывала вывод для кода Python с помощью readи это могут быть хорошие решения, но у вас есть readarrayвстроенная утилита -в bash, которая упрощает эту задачу.


Судя (по имени переменной и другому тексту в вашем коде, )вы можете захотеть реализовать своего рода интерактивное меню.

Это также можно сделать с помощью selectвbash:

readarray -t options < <( python3 test.py )

echo 'Please select your option' >&2
PS3='Your selection: '
select ch in "${options[@]}"; do
    [ -n "$ch" ] && break
    echo 'Invalid, try again' >&2
done

printf 'You chose option %d ("%s")\n' "$REPLY" "$ch"

Это будет использовать вывод вашего скрипта Python в качестве параметров в цикле select. Цикл будет продолжаться до тех пор, пока пользователь не выберет допустимый вариант. В конце печатается выбранный вариант (и его номер ).

Подсказка PS3— это подсказка, используемая selectв bash. Значение по умолчанию — #?, за которым следует пробел.

3
28.01.2020, 02:14

Теги

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