Анализ внутри подстановки команд в стиле backquote немного странный - он требует дополнительного уровня экранирования (то есть обратной косой черты), чтобы контролировать, когда происходит расширение.Уродливое решение: добавьте больше обратной косой черты.Лучшее решение: используйте $()
вместо обратных кавычек - он делает то же самое, но без странных проблем с синтаксическим анализом и экранированием.
Кстати, ваш скрипт, похоже, имеет некоторые другие проблемы.Во-первых, я не знаю о sed
в вашей системе, но версии, с которыми я знаком, интерпретируют \n
в подстановке не как новую строку (которую, я полагаю, вы хотите), а как литерал n
символ.Одним из решений является включение в подстановку буквального символа новой строки (которому предшествует обратная косая черта).
Кроме того, цикл выполняется для каждого найденного файла, но для файлов, которые не имеют точки в имени, первыйКоманда sed
удаляет их, $v
пуста, и вы добавляете пустую строку в myscript.sh.Вы должны либо поместить фильтрующий вызов sed
в оператор for
, либо добавить его в качестве фильтра в команду find
.
#!/bin/bash
nsisscript=myscript.sh
nl=$'\n'
FILES=*
for f in $(find $FILES -name "*.*"); do
v=$(echo $f | sed -e "s/^.*/\${File} \${INST\_FILES} &/" | sed -e "s/\( \)\([a-zA-Z0-9]*\/\)/\/\2/" | sed -e "s/\(\/\)\([a-zA-Z0-9\_\-\(\)\{\}\$]*\.[a-zA-Z0-9]*\)/ \2/")
sed -i.backup -e "s/\;Insert files here/$v\\$nl&/" $nsisscript
done