получение неожиданной ошибки EOF

Попробуйте это.

scanimage -p --resolution 250 --mode Gray -x 210 -y 297 | pnmtops -imageheight 11.7 -imagewidth 8.3 | ps2pdf - output.pdf
0
01.02.2017, 01:42
2 ответа

Разделитель конца 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?"

.
1
28.01.2020, 02:16
 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".

Это «слон в комнате». Я не могу исправить эту логику, потому что не могу читать ваши мысли. Не совсем понятно, что вы пытаетесь сделать.

Я могу предположить несколько различных вариантов:

  1. Возможно, вы пытаетесь выполнить команду isql для каждого файла в каталоге cons. (В этом случае команда isql должна где-то ссылаться на переменную indsystem, и вы должны убедиться, что не запускаете ее в каталогах.)
  2. Возможно, вы хотите запустить isql ровно один раз, но только если каталог cons не пуст.
  3. Возможно, вы хотите запустить команду isql без ссылки на indsystem, но запустить ее таким же образом несколько раз, ровно столько раз, сколько файлов/каталогов в cons. (Это то, что будет делать моя фиксированная версия кода, но это не имеет большого смысла.)

Ни одна из этих возможностей не является очевидно правильной, поэтому я не могу сделать вывод о том, что на самом деле пытается сделать сценарий. делать.

Тем не менее, я надеюсь, что это помогло мне больше узнать о сценариях оболочки. Чтобы правильно изучить сценарии Bash, я рекомендую Wooledge Bash Guide.


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

4
28.01.2020, 02:16

Теги

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