Я могу воспроизвести эту проблему как в Ubuntu bash, так и в Windows / Cygwin bash. Проблема возникает с именами файлов и каталогов, в которых есть пробелы. Вот мой скрипт под названием pass-dir-names-with-space. sh:
for dir in "$@"
do
echo dir = $dir
done
Это прекрасно работает:
./pass-dir-names-with-spaces.sh *
dir = pass-file-names-with-spaces.sh
dir = this is a directory with spaces in it
dir = this is a file name with spaces.txt
dir = this is another file name with spaces.txt
Я получаю полное имя файла в каждой строке даже если в нем есть пробелы. Иногда это вполне приемлемо, потому что мне нужны имена файлов и каталогов. Однако иногда я хочу реализовать фильтр с perl для удаления имен файлов.
Подход backtick / perl не работает! Вот моя первая попытка избежать пробелов.
./pass-dir-names-with-spaces.sh `perl -e ' my @m = (); my $c = shift @ARGV; opendir $h, $c or die "cannot opendir $c"; @a= map { push @m, $_ if -d $_ } grep(!/^\.\.$/,readdir $h); closedir $h; foreach (@m){s/ /\\\\ /g; print " $_ " } ' .`
dir = .
dir = this\
dir = is\
dir = a\
dir = directory\
dir = with\
dir = spaces\
dir = in\
dir = it
Я попытался использовать вместо этого кавычки:
./pass-dir-names-with-spaces.sh `perl -e ' my @m = (); my $c = shift @ARGV; opendir $h, $c or die "cannot opendir $c"; @a= map { push @m, $_ if -d $_ } grep(!/^\.\.$/,readdir $h); closedir $h; foreach (@m){ print " \"$_\" " } ' .`
dir = "."
dir = "this
dir = is
dir = a
dir = directory
dir = with
dir = spaces
dir = in
dir = it"
Кажется, bash игнорирует мои кавычки! Кажется, что "$ @" ведет себя неправильно! Как я могу отфильтровать имена файлов?
Спасибо
Зигфрид