Я пытаюсь извлечь список дат из серии ссылок, используя функцию дампа lynx и передавая результаты через grep и awk. Эта операция успешно работает в терминале и точно выводит даты. Однако когда он помещается в скрипт оболочки, bash заявляет о синтаксической ошибке:
Scripts/ETC/PreD.sh: line 18: syntax error near unexpected token `('
Scripts/ETC/PreD.sh: line 18: ` lynx --dump "$link" | grep -m 1 Date | awk '{print substr($0,10)}' >> dates.txt'
Для контекста это часть цикла while-read, в котором $ link читается из файла. Все операции, выполняемые внутри этого цикла while при удалении команды awk, являются успешными, как и аналогичные циклы while, которые включают другие команды awk.
Я знаю, что либо неправильно понимаю, как bash обрабатывает подстановку переменных, либо как bash обрабатывает команды awk, либо какую-то комбинацию этих двух. Любая помощь будет очень признательна.
РЕДАКТИРОВАТЬ: Shellcheck разделен на это, версия веб-сайта не находит ошибки, но моя загруженная версия предоставляет ошибку SC1083, которая говорит:
This { is literal. Check expression (missing ;/\n?) or quote it.
Проверка на странице Shellcheck GitHub обеспечивает следующее:
This error is harmless when the curly brackets are supposed to be literal, in e.g. awk {'print $1'}.
However, it's cleaner and less error prone to simply include them inside the quotes: awk '{print $1}'.
Сценарий следует:
#!/bin/bash
while read -u 4 link
do
IFS=/ read a b c d e <<< "$link"
echo "$e" >> 1.txt
lynx --dump "$link" | grep -A 1 -e With: | tr -d [:cntrl:][:digit:][] | sed 's/\With//g' | awk '{print substr($0,10)}' | sed 's/\(.*\),/\1'\ and'/' | tr -s ' ' >> 2.txt
lynx --dump "$link" | grep -m 1 Date | awk '{print substr($0,10)}' >> dates.txt
done 4< links.txt