Вы можете использовать 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"
Использование петли 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 не сообщает о каких-либо проблемах ни с одним из двух приведенных выше фрагментов кода.
Проблема именно в том, что 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