Загрузка файлов из SUSE Linux на Google Диск с помощью командной строки или оболочки

Одна из многих вещей, которые getoptделает при синтаксическом анализе параметров, заключается в переупорядочении аргументов, так что аргументы, не являющиеся -параметрами, идут последними, а комбинированные короткие параметры разделяются. Изman getopt:

Output is generated for each element described in the previous section.
Output is done in the same order as the elements are specified  in  the
input,  except  for  non-option  parameters.   Output  can  be  done in
compatible (unquoted) mode, or in such way that  whitespace  and  other
special  characters  within  arguments  and  non-option  parameters are
preserved (see QUOTING).  When the output is  processed  in  the  shell
script,  it  will  seem to be composed of distinct elements that can be
processed one by  one  (by  using  the  shift  command  in  most  shell
languages).

[...]

Normally, no  non-option  parameters  output  is  generated  until  all
options  and  their  arguments  have  been  generated.   Then  '--'  is
generated as a single parameter, and after it the non-option parameters
in  the  order  they were found, each as a separate parameter.

Этот эффект отражается в вашем коде, где цикл обработки опции -предполагает , что все аргументы опции (, включая аргументы опции ), идут первыми, идут отдельно и, наконец, за которыми следуют не -аргументы опции.

Таким образом, TEMPсодержит переставленные, заключенные в кавычки, разделенные -параметры, и использование eval setделает их аргументами сценария.

Почему eval? Вам нужен способ безопасного преобразования вывода getoptв аргументы. Это означает безопасную обработку специальных символов, таких как пробелы, ', "(, кавычки, ), *и т. д. Для этого getoptэкранирует их в выводе для интерпретации оболочкой. Без evalединственным вариантом является set $TEMP,но вы ограничены тем, что возможно, путем разделения полей и подстановки вместо полной возможности синтаксического анализа оболочки.

Допустим, у вас есть два аргумента. Невозможно получить эти два слова как отдельные слова, используя только разделение полей без дополнительного ограничения символов, используемых в аргументах (, например, скажем, вы установили IFS в :, тогда вы не можете иметь :в аргументах ). Таким образом, вам нужно иметь возможность экранировать такие символы и интерпретировать это экранирование оболочкой, поэтому evalнеобходим. За исключением серьезной ошибки в getopt, это должно быть безопасно.


Что касается shift, то он делает то же, что и всегда :удаляет первый аргумент и сдвигает все аргументы (так, что то, что было $2, теперь будет$1). Это устраняет аргументы, которые были обработаны, так что после этого цикла остаются только аргументы опции, отличные от -, и вы можете удобно использовать $@, не беспокоясь об опциях.

0
21.11.2019, 14:51
1 ответ

Взгляните на rclone , он поддерживает Google Диск . Он должен быть доступен в репозиториях openSUSE.

Rclone is a command line program to sync files and directories to and from [...]

Конфигурация для Google Диска доступна здесь(в основном, используйте rclone configи получите токен из своей учетной записи Google ); затем, когда он настроен как источник, вы можете использовать команды rclone для копирования данных из/в него.

5
28.01.2020, 02:29

Теги

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