параметры сценария bash

Мне нужно написать сценарий bash, и я хочу, чтобы он анализировал неупорядоченные параметры в формате:

scriptname --param1 <string> --param2 <string> --param3 <date>

Есть ли простой способ сделать это, или я в значительной степени застрял на 1, 2, 3 долларах?


person Brent    schedule 06.05.2009    source источник


Ответы (5)


Вам нужны getopts.

person Lance Richardson    schedule 06.05.2009
comment
getopts не поддерживает длинные переключатели (начинающиеся с -). getopt работает, но использовать / читать его ужасно. - person Cameron; 06.05.2009
comment
Хороший момент - если длинные переключатели необходимы, то getopts - неподходящий инструмент. - person Lance Richardson; 06.05.2009
comment
Этот ответ будет лучше с содержанием и / или примером, а не просто ссылкой. - person Vincent Scheib; 12.03.2013

Хорошим примером того, как разместить короткие и длинные переключатели бок о бок, является mcurl:

http://www.goforlinux.de/scripts/mcurl/

person Community    schedule 07.05.2009

Как упоминалось здесь ранее, в Bash есть функция getops, которая может решить ваши проблемы.

Если вам нужно что-то более сложное, bash также поддерживает позиционные параметры (упорядоченные $ 1 ... $ 9, а затем $ {10} .... $ {n}), вам придется придумать свою собственную логику, чтобы справиться с этим. Вход. Один из простых способов - поместить переключатель / регистр внутри цикла for, перебирая параметры. Вы можете использовать одну из двух специальных переменных bash, обрабатывающих ввод: $ * или $ @.

person Macaubas    schedule 06.05.2009

#!/bin/bash

# Parse the command-line arguments
while [ "$#" -gt "0" ]; do
  case "$1" in
    -p1|--param1)
      PARAM1="$2"
      shift 2
    ;;
    -p2|--param2)
      PARAM2="$2"
      shift 2
    ;;
    -p3|--param3)
      PARAM3="$2"
      shift 2
    ;;
    -*|--*)
      # Unknown option found
      echo "Unknown option $1."

      exit 1
    ;;  
    *)
      CMD="$1"
      break
    ;;
  esac
done 


echo "param1: $PARAM1, param2: $PARAM2, param3: $PARAM3, cmd: $CMD"

Когда я выполняю это:

./<my-script> --param2 my-param-2 --param1 myparam1 --param3 param-3 my-command

он выводит то, что вы ожидаете:

param1: myparam1, param2: my-param-2, param3: param-3, cmd: my-command
person reljicb    schedule 22.01.2016

person    schedule
comment
Разве do_foo $ 2 не должно быть do_foo $ 1? - person xx77aBs; 08.08.2014
comment
@ xx77aBs да, должна! - person lhunath; 09.08.2014