He creado el siguiente script para adjuntar un archivo CSV. Está truncando incorrectamente el nombre de la columna de CSV y también hay un archivo más que se obtiene con el correo electrónico, a saber, 'ATT0001.txt'.
(
echo "From:"$1;
echo "To:"$2;
echo "Subject:"$3;
echo "MIME-Version: 1.0";
echo "Content-Type:multipart/mixed; boundary=\"B835649000072104Jul07\"";
echo "--B835649000072104Jul07";
echo "Content-Type: text/html; charset=\"UTF-8\"";
echo "Content-Transfer-Encoding: 7bit";
echo "Content-Disposition: inline";
echo "";
echo "$4";
echo "--B835649000072104Jul07";
echo "Content-Type: text/csv";
echo "Content-Transfer-Encoding: base64";
echo "Content-Disposition: attachment; filename=\"$5\"";
base64 "$5"
echo "--B835649000072104Jul07";
) | sendmail -t
вы можете использовать |
как последний символ в строке, и эта строка будет продолжена.
например
foo | bar | wc
эквивалентно
foo |
bar |
wc
;
будет отделять команду как новую строку. Я делаю отступ в последней части вашего скрипта, вставляю новую строку во внешние |
и;
последняя строка выглядит как
find *.mp4 |
sed 's:\ :\\\ :g' |
sed 's/^/file /' |
sort -R > $VIDEO_LIST
(printf 'g?%s?m0\n' $2 ; printf 'wq\n') |
ed -s $VIDEO_LIST
( printf 'g?%s?m$\n' $3 | tac; echo 'wq'; ) |
ed -s $VIDEO_LIST
ffmpeg -f concat -i $VIDEO_LIST -c:v libx264 -crf 12 -preset slow -c:a copy $COMPILED.mp4
откуда берутся ? (Другой ответ на этот вопрос)$2
и $3
? командная строка ? использованиеset alpha bravo charly
выглядит как отсутствующий '\n'
во втором sed.
будь авантюристом, отправь свой сценарий наhttps://codereview.stackexchange.com/
Вдобавок к тому, что прокомментировал John1024, такие аргументы, как -f file1 file2 file3
, на самом деле будут читаться как-f file1
:только первое значение считывается в скрипт, остальные теряются. То же самое происходит и с вашими -l
аргументами.
Что вы можете сделать, так это указать строку, которая на самом деле является списком значений (обратите внимание на одинарные кавычки, окружающие значения):
./compile.sh -n NAME_ALBUM -f 'file1 file2 file3' -l 'file7 file8 file9'
Таким образом, вы закончите с:
-f
должно быть " file1 file2 file3
" -l
должно быть " file7 file8 file9
" Вам «просто» нужно разделить их, чтобы получить имена файлов. Такая конструкция должна вас вдохновить:
f='file1 file2 file3'; for fileName in $f; do echo "$fileName"; done
РЕДАКТИРОВАТЬ после вопроса в комментариях:
Are the quotes required during usage? Or can they be hidden in the script? Because I already thought of that, but I think they would have to be used during command line usage of the script which is not what I wanted.
Это мне не совсем ясно, но могу сказать, что:
'file1 file2 file3'
(с кавычками )представляет собой одну строку (с пробелами ), и ее сохранение в переменной или передача в качестве параметра (наподобие-f <value>
)вполне осуществимы file1 file2 file3
(без кавычек )— это 3 отдельные строки (, поскольку пробелы действуют как разделитель параметров.Вы не можете передать 3 значения одному параметру в конструкции -f <value>
, если только вы не используете хак, подобный приведенному выше (, то есть кавычки )Also, what about $2 $3 $4 $5 as -f and $6 $7 $8 $9 as -l ?
Смешивание конструкции getopts
и параметров $n
приведет к нечитаемому сценарию. Кроме того, эта стратегия $n
предполагает наличие ровно 4 значений для -f
и 4 значений для -l
.
Мой совет по-прежнему кормить ваши опции -f
и -l
списком файлов:'file1 file2 file3'
и вырезать эти списки внутри вашего скрипта.