bash: прохождение путей с пробелами в качестве параметров?
У меня есть bash-скрипт, который получает набор файлов от пользователя. Эти файлы иногда находятся в каталогах с пробелами в их именах. К сожалению, в отличие от этот вопрос все имена файлов передаются через интерфейс командной строки. Предположим, что пути правильно цитируются по мере их передачи пользователем, поэтому пробелы (за исключением кавычек) являются разделителями между путями. Как бы я переслал эти параметры подпрограмме в моем скрипте bash таким образом, чтобы сохраняет цитируемые пробелы?
4 ответов
#! /bin/bash
for fname in "$@"; do
process-one-file-at-a-time "$fname"
done
обратите внимание на чрезмерное использование кавычек. Все это необходимо.
передача всех аргументов другой программе еще проще:
process-all-together "$@"
сложный случай, когда вы хотите разделить аргументы пополам. Для этого требуется гораздо больше кода в простой оболочке POSIX. Но, возможно, у Bash есть некоторые особенности.
вы хотите "$@"
, который имеет специальный синтаксис расширения $@
но сохранение кавычки белого пространства вызывающего объекта (он не создает ни одной гигантской строки со всеми аргументами в ней). Поэтому кто-то может назвать ваш скрипт так:
bash-script.sh AFile "Another File With Spaces"
тогда в вашем скрипте вы можете делать такие вещи, как:
for f in "$@"; do
echo "$f";
done
и получаем две строки вывода (не 5).
прочитайте абзац о специальном параметре " @ " здесь: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters
Браво @Roland . Thans много для вашего решения
это действительно сработало!
Я написал простую функцию скрипта, которая открывает заданный путь с помощью nautilus.
и я только что вложил функцию с этим "помощником" для цикла в основную функцию:
fmp () {
fmp2() {
nautilus "$@";
};
for fname in "$@";
do
fmp2 "$fname";
done;
}
теперь я могу заставить все мои скрипты работать с путями, просто превратив их во вложенные функции, обернутые функцией с этим помощником для цикла.
"$var"
например,
$ var='foo bar'
$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>
$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>