Одна из многих вещей, которые 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
). Это устраняет аргументы, которые были обработаны, так что после этого цикла остаются только аргументы опции, отличные от -, и вы можете удобно использовать $@
, не беспокоясь об опциях.
Взгляните на rclone , он поддерживает Google Диск . Он должен быть доступен в репозиториях openSUSE.
Rclone is a command line program to sync files and directories to and from [...]
Конфигурация для Google Диска доступна здесь(в основном, используйте rclone config
и получите токен из своей учетной записи Google ); затем, когда он настроен как источник, вы можете использовать команды rclone для копирования данных из/в него.