Я пишу 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[@]}"
вместо [*]
.
Видеть:Разделение слов,Почему мой скрипт оболочки тормозит пробелы и другие специальные символы?иМассивы