2015-04-22 6 views
0

Итак, я пытаюсь написать скрипт дляРазделительные аргументы с getopts

1.) Создайте новый каталог с именем пользователя указавшего

2.) Загрузка файлов с удаленного места в новый каталог

3.) Добавление порта в файл в новом каталоге

То, что я сейчас

OPTIND=1 
while getopts "hpnm:" opt; do 
case "$opt" in 
    h) 
     show_help 
     exit 0 
     shift 
     ;; 
    p) port="*@" 
     shift 
     /home/servers/zombies/"$server_name"/server.properties >> port: "[email protected]" 
     ;; 
    n) server_name="$*" 
     shift 
     mkdir /home/ecb/servers/zombies/"$*" 
     ;; 
    m) map_name="$*" 
     shift 
     rsync -azvP [email protected]:/home/downloads/zombies/"$*" /home/servers/zombies/"$server_name"/ 
     ;; 
esac 
done 

Когда я запускаю скрипт, он интерпретирует «-n Test -m test -p 1234» как «тестовый тест 1234». Как я могу отделить аргументы?

ответ

1
  1. Не shift. Это путает getopts, так как вы изменяете список аргументов во время работы.

  2. Если опция принимает аргумент, поместите двоеточие после символа в векторе аргумента. В вашем случае -p, -n и -m все принимают аргументы, а не только -m. Таким образом, ваш вызов должен быть:

    while getopts "hp:n:m:" opt; do 
    
  3. Для ссылки на аргумент опции, используйте $OPTARG. getops помещает аргумент в эту переменную (если вы сказали getopts, что опция принимает аргумент).

  4. Когда getopts заканчивается, OPTIND будет индексом первого позиционного аргумента. На данный момент, если вы хотите, вы можете сместиться все потребленные аргументы:

    shift $((OPTIND-1)) 
    

    Или вы можете сканировать их с помощью bash «s подпоследователь обозначения:

    for arg in "${@:OPTIND}"; do 
    
  5. Это, как правило, не хорошая идея немедленно действовать по вариантам. Скорее всего, вы обычно сохраняете каждый аргумент переменной и обрабатываете переменные при завершении разбора параметров. Существует несколько причин:

    • Вы можете обнаружить ошибку после того, как первая опция была распознана. В этом случае вы обычно хотите создать сообщение об ошибке, не изменяя состояния мира.

    • Обычно опций нет, поэтому они обозначаются буквенными буквами опциона, а не позиционными). Часто бывает, что действия лучше выполняются в определенном порядке.

    • Опции, по определению, не обязательны. Но вы не знаете, что опция не указана до тех пор, пока вы не дойдете до конца списка. Если параметр имеет значение по умолчанию, или если не спецификация параметра влияет на поведение вашего скрипта, вы, вероятно, захотите узнать об этом, прежде чем начинать что-то делать.

  6. Это, как правило, нет необходимости инициализировать OPTIND, так как bash делает это автоматически, когда он создает новую среду выполнения.

+0

Поэтому я переместил его так, чтобы аргументы были вставлены в эту опцию, но я до сих пор не получил его для разделения ввода. – Dhs92

+0

@ Dhs92: См. Пункт 1. – rici

+0

У меня есть сдвиг, но он все еще выводит это: http://prntscr.com/6wq6jb (Примечание. Я знаю, что пути и команды на этом аппарате несуществующие) – Dhs92

Смежные вопросы