Как отделить функцию от аргументов в bash? - PullRequest
0 голосов
/ 07 ноября 2018

Я пишу bash-скрипт с именем safeDel.sh с базовыми функциями, включая:

  • файл [файл1, файл2, файл3 ...]
  • -l
  • -t
  • -d
  • -m
  • -k
  • -r arg

Для однобуквенных аргументов я использую встроенную функцию getops, которая прекрасно работает. У меня сейчас проблема с аргументом file. Аргумент 'file' должен принимать список файлов для перемещения в каталог, подобный следующему:

$ ./safeDel.sh file file1.txt file2.txt file3.txt

Ниже приведен фрагмент запуска моей программы:

#! /bin/bash

files=("$@")
arg="$1"
echo "arguments: $arg $files" 

Оператор echo показывает следующее:

$ arguments : file file

Как я могу отделить аргумент файла от файлов, которые должны быть перемещены в каталог?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Предполагая, что параметры, обработанные getopts, были удалены из списка аргументов командной строки, и что была проведена проверка, чтобы убедиться, что осталось хотя бы два аргумента, этот код должен делать то, что нужно:

arg=$1
files=( "${@:2}" )

echo "arguments: $arg ${files[*]}"

files=( "${@:2}" ) помещает все аргументы командной строки после первого в массив с именем files. См. Обработка позиционных параметров [Bash Hackers Wiki] для получения дополнительной информации.

${files[*]} расширяется до списка файлов в массиве files внутри аргумента до echo. Чтобы безопасно развернуть список в files для зацикливания или для передачи в команду, используйте "${files[@]}". См. Массивы [Bash Hackers Wiki] .

0 голосов
/ 07 ноября 2018

Это способ, которым вы можете достичь своих потребностей:

#!/bin/bash

declare -a files="$@"
for fileToManage in ${files}; do
  echo "Managing ... $fileToManage"
done

Но это работает, только если в именах файлов нет места, в этом случае вам нужно проделать дополнительную работу.

Дайте мне знать, если вам понадобится дополнительная помощь.

...