bash: прохождение путей с пробелами в качестве параметров? - PullRequest
16 голосов
/ 24 сентября 2011

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

Ответы [ 4 ]

20 голосов
/ 24 сентября 2011
#! /bin/bash

for fname in "$@"; do
  process-one-file-at-a-time "$fname"
done

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

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

process-all-together "$@"

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

3 голосов
/ 24 сентября 2011

Вы хотите "$@", который имеет специальный синтаксис расширения $@, но сохраняет кавычки пробела для вызывающего (это не создает единую гигантскую строку со всеми аргументами в ней).Таким образом, кто-то может назвать ваш скрипт следующим образом:

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

0 голосов
/ 24 сентября 2017

Браво @ Роланд .Большое спасибо за ваше решение

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

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

И я только что вложил функцию с этим «helper» -for-loop в основную функцию:

fmp ()  {

    fmp2() { 
        nautilus "$@"; 
    };

    for fname in "$@";
    do         
        fmp2 "$fname";         
    done; 
}

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

0 голосов
/ 24 сентября 2011
"$var"

Например,

$ var='foo bar'

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

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