shellcheck предупреждает о циклах при выводе результатов поиска, даже если указан путь для начала поиска [дубликат]

Вы можете использовать egrep также

egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename

В скрипте

#!/bin/bash
disp_x=$(egrep '[0-9][0-9].[0-9][0-9].[0-9][0-9]_[0-9][0-9].[0-9][0-9]' filename)
echo "$disp_x"
3
19.03.2018, 12:29
2 ответа

Использование петли forпо выходу findв лучшем случае является анти--шаблоном. См. BashFAQ/001 -Как я могу прочитать файл (поток данных, переменную )строку -по -строку (и/или поле -по полю -)? почему. Используйте цикл while, как показано ниже, с командой read. Приведенная ниже команда разделяет вывод findнулевым байтом, а команда readчитает путем разделения на этот байт, так что все файлы со специальными символами в именах безопасно обрабатываются (, включая новые строки)

#!/usr/bin/env bash

site="hello"
wDir="/home/websites/${site}/httpdocs/"

find "${wDir}" -name "*.css" -type f -print0 | while IFS= read -r -d '' file; do
    printf '%s\n' "$file"
done

Или вообще не используйте конвейерные -линии и выполняйте -подстановку

while IFS= read -r -d '' file; do
    printf '%s\n' "$file"
done< <(find "${wDir}" -name "*.css" -type f -print0)

Веб-сайт ShellCheck не сообщает о каких-либо проблемах ни с одним из двух приведенных выше фрагментов кода.

7
27.01.2020, 21:07

Проблема именно в том, что shellcheck говорит вам, что:forциклы, перебирающие вывод findили подобных команд, являются хрупкими. Например:

$ ls
'a file with spaces' 

$ for file in $(find. ); do    echo "$file"; done
.
./a
file
with
spaces

Безопасным способом было бы использовать -execизfind:

$ find. -exec echo  {} \;
.
./a file with spaces

Или использовать цикл while:

$ find. -print0 | while IFS= read -r -d '' file; do echo "$file"; done
.
./a file with spaces
11
27.01.2020, 21:07

Теги

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