Пример:
$ ls
script.sh
$ var='* *'
$ echo $var
script.sh script.sh
$ echo "$var"
* *
$ echo '$var'
$var
В вашем коде есть две проблемы, из-за которых значение в $extension
расширяется до содержащегося в нем шаблона подстановки, а также приводит к преждевременному сопоставлению шаблона подстановки с именами файлов (вы хотите передать его как -— это ffmpeg -i
, который выполняет внутреннее расширение глобуса ).
Первый — это вызов вашей функции:
runprintcommand ffmpeg -loglevel verbose -pattern_type glob -i ${extension} "$movieName" ;
Здесь ${extension}
не заключено в кавычки, поэтому вы определенно получите (разбиение на слова -и )подстановку имени файла, происходящую по его значению.
Вторая проблема связана с самой функцией:
function runprintcommand() {
echo "Command to run: (Note: '\\' escape character may not be printed)" ;
echo "$*" ;
$* ;
}
Здесь вы используете $*
без кавычек, что снова (разбивает значение на слова, а затем )расширяет глобус, даже если вы дважды -цитируете ${extension}
в вызове функции.
Вместо простого $*
используйте"$@"
(с двойными кавычками ). Это будет расширено до отдельно цитируемых позиционных параметров функции.
В этом разница между "$@"
и"$*"
:
"$*"
— это одинарная двойная -строка в кавычках . Обычно это нельзя использовать для выполнения команды с аргументами. "$@"
— это список слов в двойных кавычках . Это можно использовать для выполнения команды с аргументами.Я вижу как минимум 3 вещи:
Модификатор \U
преобразует в верхний регистр, в то время как вас попросили преобразовать из верхнего регистра в нижний
Похоже, ваше выражение вообще не удаляет пробелы -это, вероятно, проще всего сделать как отдельное выражение, например. s/ //g
или (для замены горизонтальных пробелов в более общем смысле)s/[[:blank:]]//g
Использование-i
(или--in-place
)не имеет смысла, если вы хотите перенаправить или направить вывод команды в другой файл или процесс.
Собрав все это вместе, вы могли бы использовать
sed -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile > newfile
Если вы хотите сначала изменить oldfile
на месте, а затем перенести содержимое в newfile
с помощью перенаправления, вы можете сделать это, по крайней мере, в GNU sed, используя:
sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' -e 'w /dev/stdout' oldfile | tee newfile
Обратите внимание, что вам необходимо явно записать в /dev/stdout
, так как измененный файл не записывается в стандартный вывод по умолчанию, когда используется опция -i
.
В качестве альтернативы (и проще )переместите или скопируйте измененный файл:
sed -i.bak -e 's/[[:blank:]]//g' -e 's/.*/\L&/' oldfile && cp oldfile newfile