В более старых версиях bash
была такая же ошибка/ошибка, как и в
cat <<< $var
Содержимое $var
будет подвергаться разбиению на слова (, но не подстановке ), и результирующие слова объединяются пробелами перед помещением во временный файл, установленный в качестве входных данных для команды cat
.
Это было исправлено в bash -4.4 для согласования с другими оболочками, поддерживающими этот <<<
оператор zsh.
Для более старых версий это еще один случай, когда вам нужно заключать свои переменные в кавычки.
Таким образом, если бы $IFS
содержало i
или f
, это могло бы объяснить несоответствие:
$ a='if' bash4.1 -c 'IFS=f; cat <<< $a'
i
$ a='if' bash4.4 -c 'IFS=f; cat <<< $a'
if
В любом случае обратите внимание, что -e 'if('
является избыточным, поскольку, если текст содержит if(
как слово, он также содержит слово if
.
Также обратите внимание, что bash
имеет встроенное сопоставление регулярных выражений -, так что вы всегда можете сделать
re='\<if\>'
if [[ $p =~ $re ]]; then
printf '"%s" contains a "if" word\n' "$p"
fi
(по крайней мере, в таких системах, как Linux Mint и RHEL, где ERE имеют эти \<
, \>
, но если ваш grep
поддерживает -w
,вполне вероятно, что ERE также будут иметь \<
и \>
).
(выше — один из тех очень редких случаев, когда $p
не нужно цитировать (хотя цитирование не повредит ), а$re
нельзя цитировать (в противном случае его содержимое принимается не как регулярное выражение, а как фиксированная строка))
Со стандартным синтаксисом sh
вы также можете:
case +$p+ in
(*[^[:alnum:]_]if[^[:alnum:]_]*)
printf '"%s" contains a "if" word\n' "$p"
esac
Чтобы получить тот же эффект.
$ find. -type d -links 2 -path '*CDE*'
./foo/CDE/X
./foo/CDE/Z
./foo/CDE/W
./foo/CDE/Y
./bar/CDE/Q
./bar/CDE/V
Или используйте
find. -type d -links 2 -path '*/CDE/*'
, если вы знаете, что CDE
— это имя подкаталога где-то в середине путей, которые вы ищете.
find. -type d -links 2 -name "CDE" -print
соответствует каталогам , чье базовое имя точно равноCDE
(из-за-name CDE
)и у которых нет дочерних каталогов (из-за-links 2
).
Базовое имя файла — это бит после последнего /
его пути. Например, базовое имя ./foo/CDE/W
— W
. Из этого вы видите, что ни один из каталогов не соответствует обоим условиям.
Вы ищете
find. -type d -links 2 -path '*/CDE/*'
Опция -path pattern
верна, если
the current pathname matches pattern using the pattern matching notation described in Pattern Matching Notation.
В «Обозначении сопоставления с образцом» звездочка соответствует любой строке.
В качестве последнего примечания, -print
используется по умолчанию, если -ok
или -exec
не присутствуют, так что вы можете удалить его.