Как подготовить указанные параметры в bash? - PullRequest
1 голос
/ 17 июня 2020

Приведенный ниже фрагмент кода bash объясняет мою проблему. Я хочу сгенерировать аргументы после -i во время вызова команды zip.

#!/bin/bash
from_date=2020-05-17
to_date=2020-06-17 #tomorrow's date

w='"*a*" "*b*"'
# doesn't work
find . -newermt "$from_date" ! -newermt "$to_date" | zip zipf.zip -@ -i $w

#works
find . -newermt "$from_date" ! -newermt "$to_date" | zip zipf.zip -@ -i "*a*" "*b*"

Последняя строка работает, потому что я жестко запрограммировал параметры. Однако, если я использую переменную w, и я пробовал много способов записать ее, но безуспешно, возникает ошибка типа: zip error: Nothing to do! (zipf.zip) Какое значение переменной w будет работать в этом случае?

Ответы [ 2 ]

4 голосов
/ 17 июня 2020
... | zip zipf.zip -@ -i "*a*" "*b*"

Это два отдельных аргумента в кавычках - оболочка, таким образом, не расширяет ни один из шаблонов, и они принимаются zip в качестве аргументов для -i.

w='"*a*" "*b*"'
... | zip zipf.zip -@ -i $w

Поскольку вы не цитировали $w, когда он раскрывается, он подлежит разделению на слова (что вы хотите) и расширению имени пути (чего вы не хотите, чтобы bash делал). У вас нет файлов, соответствующих шаблонам в нем (возможно, из-за двойных кавычек, которые являются частью слов).

Вместо этого вы можете использовать массив для хранения шаблонов:

w=("*a*" "*b*")
... | zip zipf.zip -@ -i "${w[@]}"

(Кавычки здесь важны; они вызывают расширение массива в строки в кавычках, поэтому расширение имени пути не выполняется)

1 голос
/ 17 июня 2020

Этот глобус

w='"*a*" "*b*"'

неправильный.

Оболочка не расширяет подстановочные знаки с этим. Вам нужно:

w='*a* *b*'

Вы можете протестировать с помощью:

printf '%s\n' $w
...