Я не думаю, что вы хотите передать одинарные кавычки в 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[@]}"
вместо [*]
.
См: Разделение слов, Почему мой сценарий оболочки подавляется пробелами или другими специальными символами? и Массивы
Конечно, есть другие способы сделать это, но если вы ищете чистое решение Bash, которое не полагается на любых утилитах, кроме самой оболочки, будет работать следующее.
dir="The Dark Tower"
declare -i count=1
for file in "$dir"/*.mov; do
mv "$file" "${dir}/${dir} ${count}.mov"
count+=1
done