Bash: прохождение путей с пробелами в качестве параметров?

У меня есть bash script, который получает набор файлов от пользователя. Эти файлы иногда находятся в каталогах с пробелами в их именах. К сожалению, в отличие от этого вопроса все имена файлов передаются через интерфейс командной строки. Пусть предполагается, что пути правильно указаны, поскольку они передаются пользователем, поэтому пробелы (за исключением цитируемых пробелов) являются разделителями между путями. Как передать эти параметры в подпрограмму в моем bash script таким образом, чтобы сохранить пробелы?

Ответы

Ответ 1

#! /bin/bash

for fname in "[email protected]"; do
  process-one-file-at-a-time "$fname"
done

Обратите внимание на чрезмерное использование кавычек. Все это необходимо.

Передача всех аргументов другой программе еще проще:

process-all-together "[email protected]"

Трудный случай - это когда вы хотите разделить аргументы пополам. Это требует гораздо большего количества кода в простой оболочке POSIX. Но, возможно, Bash имеет некоторые специальные функции.

Ответ 2

Вы хотите "[email protected]", который имеет специальный синтаксис расширения [email protected], но сохраняя цитирование вызывающего объекта в белом пространстве (он не создает одну гигантскую строку со всеми аргументами в ней). Поэтому кто-то может назвать ваш script следующим:

bash-script.sh AFile "Another File With Spaces"

Затем в вашем script вы можете делать такие вещи, как:

for f in "[email protected]"; do 
  echo "$f"; 
done

и получить две строки вывода (не 5).

Прочитайте абзац о специальном параметре "@" здесь: http://www.gnu.org/s/bash/manual/bash.html#Special-Parameters

Ответ 3

"$var"

Например,

$ var='foo bar'

$ perl -E'say "<<$_>>" for @ARGV' $var
<<foo>>
<<bar>>

$ perl -E'say "<<$_>>" for @ARGV' "$var"
<<foo bar>>

Ответ 4

Браво @Roland. Thats много для вашего решения

Это действительно сработало!

Я написал простую функцию script, которая открывает заданный путь с помощью nautilus.

И я только вложил функцию с этим "вспомогательным" -for-loop в главную функцию:

fmp ()  {

    fmp2() { 
        nautilus "[email protected]"; 
    };

    for fname in "[email protected]";
    do         
        fmp2 "$fname";         
    done; 
}

Теперь я могу заставить все мои скрипты работать с путями, просто превратив их в вложенные функции, обернутые функцией с помощью этого хелпера для цикла.