Параметры bash script

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

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

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

Ответ 1

Вы хотите getopts.

Ответ 2

while [[ $1 = -* ]]; do
    arg=$1; shift           # shift the found arg away.

    case $arg in
        --foo)
            do_foo "$1"
            shift           # foo takes an arg, needs an extra shift
            ;;
        --bar)
            do_bar          # bar takes no arg, doesn't need an extra shift
            ;;
    esac
done

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

#!/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