Когда вы запускаете
yourcript ab*
, оболочка пытается развернуть подстановочный знак в текущем каталоге, а затем передает результат как "$@"
. Если в текущем каталоге нет совпадений, расширенный подстановочный знак (в традиционной конфигурации оболочки по умолчанию) теперь является литеральным строкой ab*
, и дальнейшее расширение подстановочного знака не будет предприниматься. .
(Bash имеет nullglob
для изменения этого поведения, так что подстановочный знак, который не соответствует ни одному файлу, заменяется ничем; но это на самом деле не помогает.)
Если подстановочный знак соответствует , совпадает с некоторыми файлами, есть вероятность, что эти файлы не будут существовать в другом каталоге, или (в общем случае), что файлы с этими именами не будут файлами, которые вы на самом деле хотел обработать.
В худшем случае, может быть есть некоторые файлы в текущем каталоге, которые соответствуют шаблону и , они все дублируют файлы с одинаковым именем в каталог назначения. Так что если у вас есть ab
и abc
как в текущем каталоге, так и в другом каталоге, но другой каталог также содержит abecedary
и abugida
, ваша команда обработает только первые два, и вы не получите предупреждение о том, что два других никогда не были сопоставлены и обработаны.
Итог, возможно, переосмыслите свой подход, чтобы передать полный путь к файлам, которые вы хотите обработать в сценарии; тогда все остальное легко, и поведение вашего скрипта будет предсказуемым и совместимым с поведением других утилит обработки файлов.
Вам все равно нужно будет sed
фактически изменять каждый файл. Просто sed '$d' files
не изменит files
, просто выведите измененное содержимое на стандартный вывод. Если у вас есть sed -i
, возможно, используйте это.
for file in "$@"
do
# Note added quotes
if [ "$file" != "-h" ] # ignore this line
then
sed -i '$d' "$file"
mv "$file" .
fi
done
Использование:
yourscript /home/usr_name/trash/ab*