Почему мой скрипт не работает должным образом?

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
-1
23.05.2019, 17:08
2 ответа

вы можете использовать |как последний символ в строке, и эта строка будет продолжена.

например

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/

1
28.01.2020, 05:07

Вдобавок к тому, что прокомментировал 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'и вырезать эти списки внутри вашего скрипта.

2
28.01.2020, 05:07

Теги

Похожие вопросы