Еще одно заслуживающее внимания качество «$ *»
и «$ @»
заключается в том, что они представляют массив оболочки - текущий набор аргументов оболочки. Их можно изменить с помощью встроенного набора set
, но в целом они являются рабочим массивом по умолчанию для любых встроенных функций массива - включая массив для
.
: "${2?no file arguments!}"
for x
do if [ "${2+:}" ]
then set ".$1"
else [ ".${x##*.}" != "$1" ] &&
[ -f "$x" ] &&
mv -- "$x" "${x%.*}$1"
fi
done
Это довольно близкое приближение к тому, что делает ваш скрипт. Он немного отличается тем, что не выполняет echo
для аргумента, который не является обычным файлом. Я не уверен, что вы делаете то, о чем думаете: вы проверяете, является ли ваш аргумент существующим, доступным, обычным файлом , но вы эхо
передает сообщение на стандартный вывод, в котором указано аргумент: такого файла нет . В unix-подобной системе все является файлом: канал - это файл, каталог - это файл, устройство - это файл. Итак, ваш тест и ваше сообщение не совпадают.Более того, если вы попросите mv
переместить несуществующий файл, он напечатает ваше сообщение для вас и в stderr - и все это само по себе.
Еще я заметил, что вы проверяете, совпадает ли ваше новое имя со старым, и я предполагаю, что это сделано для того, чтобы mv
не жаловались на перемещение файла поверх самого себя. Оказывается, mv
имеет параметр для этого.
Я бы поступил так:
: "${2?no file arguments!}"
for x
do [ "${2+:}" ] &&
set -- ".$1" && continue
set -- "${x%.*}$1" "$1"
{ [ -e "$1" ] && printf "%s: exists!\n" "$1"; } ||
{ ! [ -f "$x" ] && printf "%s: not a regular file.\n" "$x"; } ||
mv -f -- "$x" "$1"
shift
done >&2
Я полагаю, что проблема описана здесь.
http://cygwin.1069669.n5.nabble.com/Corrupt-Cygwin64-install-td130085.html
TL;DR -Проблема в антивирусе Trend.