Я провел последний час или около того, пытаясь написать довольно простой сценарий bash, и я никогда не чувствовал себя настолько глупым.
Итак, у меня есть список строк (которые являются спецификациями селектора пакетов для менеджера пакетов, если это имеет значение), которые могут содержать звездочки. Мне нужно создать командную строку, сохраняя эти звездочки, а затем вызвать программу. Вот моя наивная попытка:
xs="foo/bar */*"
xs_cmd=""
for x in $xs; do
xs_cmd="$xs_cmd -0 $x "
done
echo $xs_cmd
Мне нужно, чтобы echo вызов был эквивалентен
echo -0 foo/bar -0 '*/*'
который выводит -0 foo/bar -0 */* .
PS На самом деле первая строка немного сложнее: xs="$some foo/bar */* $(get_others)" .
Если вы запустите этот скрипт в каталоге, содержащем a/b , вы получите вместо этого -0 foo/bar -0 a/b .
Когда я меняю последнюю строку на
echo "$xs_cmd" # note the quotes
Я получаю -0 foo/bar -0 a/b и, во-первых, это не то, что я хочу, так как теперь я вызываю echo с одним аргументом, и, кроме того, это говорит мне, что расширение происходит раньше, вероятно, в for цикла.
Но я не могу изменить for линии , потому что
for x in "$xs"; do # note the quotes
только цикл будет повторяться только один раз: -0 foo/bar */* (есть один -0), поэтому добавление этих кавычек не является опцией наверняка.
Теперь, если я вернусь к исходному сценарию и заменим первую строку на
xs="foo/bar '*/*'" # note additional single quotes
Я получаю -0 foo/bar -0 '*/*' (одинарных кавычек не должно быть).
Кажется, что я пробовал каждую комбинацию кавычек и обратной косой черты звездочек, и я буквально не знаю, что теперь делать.
