Если у вас есть такая конструкция, как for file in $firstPath/*
, значение $file
будет включать значение $firstPath
, которого нет в $secondPath
.Вам нужно обрезать путь, чтобы получить голое имя файла.
В традиционной оболочке POSIX каноническим способом сделать это был внешний инструмент под названием basename
.Однако вы можете достичь того, что обычно считается эквивалентной функциональностью, используя Расширение параметра , таким образом:
for file in "$firstPath"/*; do
if [[ -f "$secondPath/${file##*/}" ]]; then
# file exists, do something
fi
done
Бит ${file##*/}
является важной частью здесь.Согласно документации, указанной выше, это означает, что «переменная $file
исключает все до последнего /
».Результат должен совпадать с тем, что выдает basename
.
Как правило, вы должны заключать в кавычки ваши переменные в bash .Кроме того, рассмотрите возможность использования [[
вместо [
, если вы на самом деле не пишете сценарии оболочки POSIX, которые должны быть переносимыми.Вам будет предоставлен более обширный набор тестов и более предсказуемая обработка переменных.Есть и другие различия .