Как сделать необязательные аргументы, которые могут быть именами файлов, содержащими пробелы

Попробуйте обновить прошивку Lenovo (последняя версия - N1CET46W (1.14)). Проверить можно с помощью команды:

sudo dmidecode -s bios-version

Новая прошивка должна помочь.

3
08.09.2016, 13:20
2 ответа

Вам нужно построить командную строку дублирования, используя массив, а не простую конкатенацию строк. Затем вы можете использовать синтаксис "$ {array [@]}" , чтобы предоставить содержимое массива для дублирования как отдельные (возможно, содержащие пробелы) аргументы. Это избавит вас от необходимости думать о побеге из пробелов или других необычных персонажей.

Чтобы увидеть, как это работает, не вызывая фактического дублирования, вы можете использовать простой скрипт, который распечатывает свои аргументы в отдельных строках, например:

#!/bin/bash

printf "BEGIN\n"

for x in "$@"
do
  printf "ARG: $x\n"
done

printf "END\n"

Я сохранил это как args.sh .

Теперь нам нужно создать команду, используя массив, например:

#!/bin/bash

if test -z "$1"
then
  printf "Need at least one argument"
  exit 1
fi

prefix=$1
shift

for arg in "$@"
do
    args+=("--exclude")
    args+=("$prefix/$arg")
done

./args.sh "${args[@]}"

В действии это работает следующим образом:

$ ./801811.sh foo bar "baz quux"
BEGIN
ARG: --exclude
ARG: foo/bar
ARG: --exclude
ARG: foo/baz quux
END

Вам нужно будет сделать больше, чтобы настроить вашу командную строку дублирования, поскольку вы также необходимо учитывать $ STUFF и $ DESTINATION , но с ними можно справиться таким же образом, добавляя элементы в массив args с помощью args + = ("что угодно") , до или после добавления исключений, в зависимости от ситуации. Затем, в конце, просто вызовите duplicity "$ {args [@]}" .

1
27.01.2020, 21:30

Пробелы здесь - отвлекающий маневр, поскольку расширение заключено в кавычки. Если мы вызываем программу из оболочки следующим образом:

program "$foo_path/$bar_name"

, она получает единственный аргумент, независимо от того, что содержат foo_path или bar_name .

Теперь давайте посмотрим на:

--exclude "$2/${4:-__nosuchfiles__}" 

Здесь вы хотите стереть всю пару аргументов, если 4 пусто или не существует, в результате получим решение:

$ {4: + - exclude} $ {4: + "$ 2 / $ 4"}

Оператор подстановки параметра : + - это то, что вам нужно: "если он пуст или не установлен, ничего не заменяйте, в противном случае подставьте альтернатива ». Мы применяем это индивидуально к - исключить и его аргумент.

Инструменты, которые используют реализацию getopt (или иным образом сами взламывают поддержку), могут принимать как - exclude = ARG , так и - исключать ARG . Если duplicity работает таким образом, мы можем воспользоваться этим:

$ {4: + "- exclude = $ 2 / $ 4"}

Полная демонстрационная программа test.sh :

#!/bin/bash

myargs()
{
  for x in "$@" ; do printf "<%s>\n" "$x"; done
}

myargs ${1:+--foo-opt} ${1:+"x $1 x"}

Выполнение:

$ ./test.sh
$ ./test.sh ""      # blank treated like missing?
$ ./test.sh abc
<--foo-opt>
<x abc x>
$ ./test.sh "ab c"
<--foo-opt>
<x ab c x>
0
27.01.2020, 21:30

Теги

Похожие вопросы