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

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

Я пишу bash-скрипт, в котором считываю переменную с помощью readэтих двух строк:

log.*.console.log log.*.log

Они разделены пространством.

Как мне переписать строки, чтобы вывод из переменной для следующей программы, вызванной в скрипте, имел такую ​​форму?'log.*.console.log' 'log.*.log'

Я пробовал sed и awk, но безуспешно.

Весь сценарий:

#!/bin/bash
if [ -z "$*" ] ; then
echo "USAGE: ./some text"
exit 1

else

echo "some text"
read varlogname

i=1
for file in $@
do
echo "Doing" $file
GTAR=$(gtar -xvf $file --wildcards --ignore-case --no-anchored "$varlogname")

for file in ${GTAR[*]}
do
mv $file $file"."${i}
i=$((i+1))
done
done
echo "Files extracted."
fi
exit 0

решение1

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

Если вам нужно readнесколько значений в 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[@]}"вместо [*].

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

Связанный контент