Попробуйте это.
scanimage -p --resolution 250 --mode Gray -x 210 -y 297 | pnmtops -imageheight 11.7 -imagewidth 8.3 | ps2pdf - output.pdf
Разделитель конца here-документа должен быть один на строке:
filetype=`isql -UDAS -PCDRD -SYTRT_DCS_FRET << EOF
select file_type from expected_file where starters_package_version = '4.0' and system_id = 'DAL'
go
EOF
`
Часто рекомендуется использовать $(...)
, а не обратные знаки для нового кода, так как $(.... )
имеют лучшие возможности вложенности и в целом выглядят лучше:
filetype=$( isql -UDAS -PCDRD -SYTRT_DCS_FRET <<EOF
select file_type
from expected_file
where starters_package_version = '4.0'
and system_id = 'DAL'
go
EOF
)
Информацию о том, почему использование $(...)
может быть предпочтительным, смотрите в статье "Устарели ли обратные знаки (т.е. `cmd`) в *sh shells?"
losystem=`ls /appl/vortex/archive/cons/*` эхо "${losystem[@]" для indsystm в "${losystem[@]}" делать filetype=`isql -UDAS -PCDRD -SYTRT_DCS_FRET << EOF выберите тип_файла из ожидаемого_файла, где starters_package_version = '4.0' и system_id = 'DAL' идти EOF` эхо "${тип файла[@]}" Выполнено
Сама синтаксическая ошибка вызвана тем, что обратная кавычка появляется в той же строке, что и EOF
, как указано в ответе Кусалананды. Однако, у этого скрипта есть и другие проблемы, поэтому в интересах улучшения возможностей сценариев оболочки во всем мире, давайте рассмотрим его поближе.
Первое заблуждение: когда вы ссылаетесь на "${losystem[@]}"
, у вас создается впечатление, что вы создали массив. У вас нет. Для этого вам нужно использовать круглые скобки в назначении переменной.
Точно так же, если вы используете массив, вам не нужно использовать ls
. Шары будут расширяться напрямую, чтобы стать элементами массива.
Это к счастью, потому что вы все равно никогда не должны анализировать вывод ls
; см.:
Таким образом, правильный способ установить переменную losystem
как массив, элементами которого являются файлы и каталоги внутри /appl/vortex/archive/cons/
это:
losystem=(/appl/vortex/archive/cons/*)
В вашей команде echo
(во второй строке) отсутствует закрывающий }
.
Кроме того, вместо этого вы можете использовать printf
:
printf '%s\n' "${losystem[@]}"
См. также:
Цикл for
подходит для перебора элементов массива Bash losystem
, поэтому, учитывая внесенные выше исправления, вы можете использовать его без изменений.
Тем не менее, вам не нужно задавать массив, и гораздо более идиоматично (чище, более интуитивно понятно) напрямую указывать файловый глобус в цикле for:
for indsystem in /appl/vortex/archive/cons/*; do
Это также имеет то преимущество, что оно совместимо с POSIX, поскольку оно не полагается на массивы Bash, поэтому оно может работать в более широком спектре оболочек (т. е. оно более переносимо).
Следующую часть вашего скрипта еще сложнее проверить, потому что кажется, что вы устанавливаете filetype
на выход команды isql
, но тогда вы ничего не делаете с этим выводом, кроме как печатаете его — плохо отформатированный — с echo
. (Снова см. Почему printf лучше, чем echo?)
Очевидный подход — вообще не устанавливать переменную, а просто запускать команду напрямую; он напечатает свой собственный вывод, чего вы в любом случае хотели:
isql -UDAS -PCDRD -SYTRT_DCS_FRET << EOF
select file_type from expected_file where starters_package_version = '4.0' and system_id = 'DAL'
go
EOF
Заметьте, что я не знаком с isql
, поэтому я не удостоверяю правильность этой команды. Это команда, которую вы сами написали, без изменений. Это может быть или не быть правильным.
Самое странное в этом сценарии то, что вы устанавливаете indsystem
для каждого элемента массива losystem
(или пытаетесь это сделать), но затем вы никогда не ссылаетесь на значение "$indsystem"
.
Это «слон в комнате». Я не могу исправить эту логику, потому что не могу читать ваши мысли. Не совсем понятно, что вы пытаетесь сделать.
Я могу предположить несколько различных вариантов:
isql
для каждого файла в каталоге cons
. (В этом случае команда isql
должна где-то ссылаться на переменную indsystem
, и вы должны убедиться, что не запускаете ее в каталогах.) isql
ровно один раз, но только если каталог cons
не пуст. isql
без ссылки на indsystem
, но запустить ее таким же образом несколько раз, ровно столько раз, сколько файлов/каталогов в cons
. (Это то, что будет делать моя фиксированная версия кода, но это не имеет большого смысла.) Ни одна из этих возможностей не является очевидно правильной, поэтому я не могу сделать вывод о том, что на самом деле пытается сделать сценарий. делать.
Тем не менее, я надеюсь, что это помогло мне больше узнать о сценариях оболочки. Чтобы правильно изучить сценарии Bash, я рекомендую Wooledge Bash Guide.
Я также отмечу, что по своему профессиональному опыту я обнаружил, что сценарий оболочки с таким количеством проблем, как этот, обычно имеет проблемы с архитектурой/дизайном на более высоком уровне, и что обычно необходимо полностью рассмотреть предполагаемую причину, по которой скрипт необходим в первую очередь, чтобы получить действительно работоспособное решение.