Это происходит из-за того, что сценарий был сохранен редактором, который использует окончания строки -DOS (, например Notepad++, например ). Вам придется удалить их из ваших скриптов.
Для этого либо используйте dos2unix
в файле скрипта, либо
$ tr -d '\r' <script >script.new && mv script.new script
(это удалит все возвраты каретки из в любом месте в скрипте)
Что касается кода в скрипте:
:
iter=1
if [ -f iter.txt ]
then rm./iter.txt
fi
Возможно, это должно выглядеть примерно так
iter=1
if [ -f "./$iter.txt" ]; then
rm "./$iter.txt"
fi
Это удаляет файл 1.txt
из текущего каталога, если он существует. Команда :
ничего не делает (почти )и может быть удалена. Значение переменной iter
следует использовать как $iter
и заключать в кавычки. И затем я, возможно, выражаюсь более явно, чем нужно, используя ./
, чтобы сказать, что файл должен быть найден в текущем каталоге.
Если вы планируете превратить это в цикл (здесь, удалив все файлы 1.txt
, 2.txt
,...,10.txt
):
iter=1
while [ "$iter" -le 10 ]; then
if [ -f "./$iter.txt" ]; then
rm "./$iter.txt"
fi
iter=$(( iter + 1 ))
done
Или, если мы чувствуем себя подлыми/ленивыми,
rm -f {1..10}.txt
в оболочках, понимающих раскрытие скобок.
Я думаю, это из-за слишком общего шаблона. Обычно утилиты командной строки выводят ошибки в stderr или терминал. Они не должны попасть в выходной файл.
Если вы grep
пропинговали xml
файлы таким образом, ваш поиск вернет всю строку, содержащую строку поиска, и, если в файле xml
нет новых строк, все содержимое файла. Довольно много «другого» в 10M файлах.
В соответствии с комментарием @Kusalananda не рекомендуется выполнять перебор xml
с помощью grep
и синтаксического анализатора xml
, например. Однако xmllint
— лучший инструмент, если вы настаиваете......
Отметьте man
для grep
и ознакомьтесь с параметром -o
, чтобы ограничить возвращаемое значение и использовать regex
, который определяет всю длину совпадения, которое вы ищете.
Если username
является атрибутом
grep -o 'username="[^"]*"'
Или лучше
xmllint --xpath "//@username"
Если username
является узлом, то что-то вроде
grep -o "username>[^<][^<]*"
Или лучше
xmllint --xpath "//username"
Для любого из запросов xmllint
просто оберните запрос в string()
, чтобы извлечь атрибут или текст узла.
xmllint --xpath "string(//username)"
xmllint --xpath "string(//@username)"