명명된 매개변수를 쉘 스크립트에 전달

명명된 매개변수를 쉘 스크립트에 전달

명명된 매개변수를 쉘 스크립트에 전달(수신)하는 쉬운 방법이 있습니까?

예를 들어,

my_script -p_out '/some/path' -arg_1 '5'

내부적 으로 다음과 같이 my_script.sh수신합니다 .

# I believe this notation does not work, but is there anything close to it?
p_out=$ARGUMENTS['p_out']
arg1=$ARGUMENTS['arg_1']

printf "The Argument p_out is %s" "$p_out"
printf "The Argument arg_1 is %s" "$arg1"

Bash나 Zsh에서 이것이 가능합니까?

답변1

단일 문자 매개변수 이름(예: )으로 제한되어도 괜찮다면 my_script -p '/some/path' -a5bash에서 내장 기능을 사용할 수 있습니다 getopts.

#!/bin/bash

while getopts ":a:p:" opt; do
  case $opt in
    a) arg_1="$OPTARG"
    ;;
    p) p_out="$OPTARG"
    ;;
    \?) echo "Invalid option -$OPTARG" >&2
    exit 1
    ;;
  esac

  case $OPTARG in
    -*) echo "Option $opt needs a valid argument"
    exit 1
    ;;
  esac
done

printf "Argument p_out is %s\n" "$p_out"
printf "Argument arg_1 is %s\n" "$arg_1"

그럼 당신은 할 수 있습니다

$ ./my_script -p '/some/path' -a5
Argument p_out is /some/path
Argument arg_1 is 5

도움이되는 것이 있습니다getopts 작은 튜토리얼또는 help getopts쉘 프롬프트에 입력할 수도 있습니다.

편집: 옵션에 인수가 없고 뒤에 s 프로그램과 같은 다른 옵션이 오면 루프 case의 두 번째 문이 실행됩니다.while-pmy_script -p -a5exit

답변2

이는 위치 지정 매개변수에 대한 파서가 아니라 key=value aa=bb매개변수에 대한 파서입니다.

for ARGUMENT in "$@"
do
   KEY=$(echo $ARGUMENT | cut -f1 -d=)

   KEY_LENGTH=${#KEY}
   VALUE="${ARGUMENT:$KEY_LENGTH+1}"

   export "$KEY"="$VALUE"
done

# use here your expected variables
echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"
echo "EXTRA_VALUES = $EXTRA_VALUES"

용법

bash args_shell_parser.sh STEPS="ABC" REPOSITORY_NAME="stackexchange" \
           EXTRA_VALUES="KEY1=VALUE1 KEY2=VALUE2"

콘솔 결과:

STEPS = ABC
REPOSITORY_NAME = stackexchange
EXTRA_VALUES = KEY1=VALUE1 KEY2=VALUE2

특징:

  • 아무것도 상관없어주문하다주장은
  • 모든 변수를 명시적으로 선언할 필요가 없습니다.
  • 값은 다음과 같습니다.공간.
  • 매개변수 값에 "=" 기호가 포함된 복잡한 경우를 처리합니다.

이 코드 조각을 스크립트 시작 부분에 배치하세요.

이 스크립트의 이전 버전:

답변3

나 이거 거기서 훔쳤어drupal.org, 하지만 다음과 같이 할 수 있습니다.

while [ $# -gt 0 ]; do
  case "$1" in
    --p_out=*)
      p_out="${1#*=}"
      ;;
    --arg_1=*)
      arg_1="${1#*=}"
      ;;
    *)
      printf "***************************\n"
      printf "* Error: Invalid argument.*\n"
      printf "***************************\n"
      exit 1
  esac
  shift
done

주목해야 할 유일한 점은 구문을 사용해야 한다는 것입니다 my_script --p_out=/some/path --arg_1=5.

답변4

방금이 스크립트를 생각해 냈습니다.

while [ $# -gt 0 ]; do

   if [[ $1 == *"--"* ]]; then
        v="${1/--/}"
        declare $v="$2"
   fi

  shift
done

이렇게 전달한 my_script --p_out /some/path --arg_1 5다음 스크립트에서 $arg_1and 를 사용할 수 있습니다 $p_out.

관련 정보