Как процедурно сгенерировать команду в скрипте bash, используя интерполяцию строк с пробелами?

РЕДАКТИРОВАТЬ:Это сработало только для одного задания -пришлось выключить и снова включить принтер, прежде чем процедура сработает для нового задания. Ваш пробег может отличаться.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:Я не могу поручиться за безопасность этой процедуры.

Возможно, это немного запоздало, но все еще актуально. Я просто попробовал это по прихоти, и это сработало.

Я поднял крышку отсека для тонера, а затем вернул ее -это было, когда принтер ожидал нажатия кнопки «Продолжить» в Windows (красный светодиод мигал ). Принтер возобновил выполнение задания для завершения двусторонней печати.

У меня были некоторые проблемы с качеством печати при использовании HPLIP, поэтому я остановился на драйвере Foomatic, (Foomatic/foo2xqx)-он предоставляет параметры, необходимые для поддержки сверхтемной печати.

Ubuntu 16.05/x64 / Printer: HP LaserJet P1005
Driver: Foomatic/foo2xqx
1
15.09.2019, 22:38
1 ответ

Не используйте echo, чтобы увидеть, какая команда выполняется. Он печатает команду после синтаксического анализа, то есть после того, как кавычки и escape-последовательности были применены и удалены); поэтому, если вывод echoвключает кавычки и/или escape-последовательности, как вы ожидаете увидеть в необработанной командной строке (, то есть до синтаксического анализа ), это указывает на то, что что-то ужасно неправильно. Сравните вывод этих двух команд echo:

$ month=Jan
$ var="Inputs/${month}\\ 2019\\ Debit.CSV"
$ echo $var
Inputs/Jan\ 2019\ Debit.CSV
$ echo Inputs/Jan\ 2019\ Debit.CSV
Inputs/Jan 2019 Debit.CSV

В первом случае escape-последовательности печатаются, указывая на то, что они не были проанализированы, применены и удалены. Во втором они исчезли, что указывает на то, что они были проанализированы, применены и удалены.

Итак, как это исправить? Два правила :1 )не помещают кавычки или escape-последовательности в переменные (, за исключением странных случаев, когда строка будет проходить дополнительный уровень синтаксического анализа ), а 2 )вместо этого помещают double -заключает в кавычки все ссылки на переменные (, включая снова ${args[@]})(, есть некоторые странные исключения ). Кроме того, вы можете добавить в массив с помощью array+=("new" "elements").

Вот исправленный скрипт:

#!/usr/bin/env bash
clear
months=(Jan Feb)
args=()
for month in "${months[@]}"; do
  args+=(-p "Inputs/${month} 2019 Debit.CSV" "Inputs/${month} 2019 Credit.CSV")
done
python ExpenseManager.py "${args[@]}"
exit 0
3
27.01.2020, 23:22

Теги

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