Заменить одинарные кавычки для строк, разделенных пробелом из переменной

Похоже, что отсутствует сценарий ./configure, определяющий, есть ли у вас компилятор описания записи "tic". Предполагая, что он действительно отсутствует на машине, вам следует установить его и снова запустить сборку. Вы не сказали, на каком дистрибутиве вы это пытаетесь. Если это Fedora, вам следует установить «tic» с помощью «dnf install -y ncurses» (или «yum install -y ncurses» в более ранних дистрибутивах Fedora). Вы также можете загрузить исходники и сборку ncurses, а затем снова запустить сборку.

Рами Розен

1
10.04.2017, 11:33
1 ответ

Я не думаю, что вы хотите передать одинарные кавычки в gtar. В такой команде, как somecmd 'foo bar' 'files*.log', оболочка обработает кавычки, они говорят ей не обрабатывать специальные символы специально, и передаст somecmd аргументы foo bar и files*.log. Программы Unix получают командную строку не как одну строку, а как несколько строк аргументов, именно оболочка выполняет разбиение командной строки на строки.

Если вы хотите прочитать несколько значений в Bash, вы можете использовать read -a array, а затем передать массив команде.

  -a array  assign the words read to sequential indices of the array
            variable ARRAY, starting at zero

т.е.

read -a filenames
gtar "${filenames[@]}"

Индексирование массива с помощью [@] (в кавычках) раскрывает члены массива как отдельные слова, что вам и нужно.

Кроме того, у вас есть for file in ${GTAR[*]}. Это похоже на обращение к GTAR как к массиву, но это не так, вы просто присвоили ему вывод команды gtar в виде строки. В этом случае ${GTAR[*]} - это то же самое, что $GTAR. Поскольку расширение не заключено в кавычки, строка в этот момент подвергается разбиению на слова, которое по умолчанию разбивается на пробельные символы. Но после этого слова также воспринимаются как глобусы имен файлов и расширяются до подходящих имен файлов.

Пока ваши имена файлов не содержат пробелов или глобальных символов (*?[]), все в порядке. Но в целом, это не то, что вы хотите делать.

Для правильных массивов, вероятно, всегда нужно использовать "${array[@]}" вместо [*].

См: Разделение слов, Почему мой сценарий оболочки подавляется пробелами или другими специальными символами? и Массивы

5
27.01.2020, 23:16

Теги

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