위치 인수 목록을 여러 번 구문 분석하기 위해 $@ 및 $#을 재설정할 수 있습니까?

위치 인수 목록을 여러 번 구문 분석하기 위해 $@ 및 $#을 재설정할 수 있습니까?

일부 매개변수를 구문 분석하는 일반 스크립트( )가 있습니다 common.sh. 다른 스크립트에서는 import it 을 사용합니다 source common.sh. 매개변수 구문 분석을 위해 아래 코드를 여러 번 사용할 수 있도록 $@합계를 재설정하는 방법이 있습니까 ?$#

매개변수 구문 분석이 실행된 후에 사용할 수 있도록 먼저 원본 스크립트 매개변수를 저장합니다.

readonly script_args=("${@}")

그러나 이는 인수만 저장하므로 shift 매개변수 분석을 실행하기 위해 여러 번 사용할 수 없습니다.

매개변수 분석:

while [[ $# -gt 0 ]]; do
    case "$1" in
    --command=*)
        command="${1#*=}"
        ;;
    --project=*)
        project="${1#*=}"
        ;;
    --workspace=*)
        workspace="${1#*=}"
        ;;
    --account=*)
        account="${1#*=}"
        ;;
    --debug)
        debug="true"
        ;;
    "")
        log_debug "Empty argument"
        ;;
    *)
        log_error "Invalid argument: ${1}"
        exit 1
        ;;
    esac
    shift
done

답변1

Bourne과 같은 셸에서는 셸 옵션을 설정하는 것 외에도 set위치 매개변수를 설정하는 데에도 사용할 수 있습니다.

set -- "${script_args[@]}"

--필요:

  1. $script_args첫 번째 요소가 or로 시작하면 옵션으로 간주되지 않도록 옵션의 끝을 표시합니다 .-+
  2. 이 문제를 해결하기 위해 인수가 에 전달되지 않으면 set위치 인수를 빈 목록으로 설정하는 대신 변수(및 일부 셸의 함수) 목록을 인쇄합니다.

"${script_args[@]}", 어느~ 해야 하다참조되는 것은 "$@"Bourne 쉘의 확장을 배열의 모든 요소로 확장하는 Korn 쉘 구문입니다. zsh이며 bash이 구문도 지원합니다 yash.

이 모든 것에서 yash당신은 또한 사용할 수 있습니다

set - "${script_args[@]}"

zsh에서는 다음을 사용할 수도 있습니다.

argv=( "$script_args[@]" )

에서는 yash다음을 사용할 수도 있습니다.

set -- "$script_args"

등가물 rc또는 파생물은 다음과 같습니다.

* = $script_args

존재하다 fish:

set argv $script_args

in csh/ tcsh(1970년대 후반 배열을 지원하는 최초의 셸)

set argv = ($script_args:q)

¹ Bourne 쉘은 --1981년 SysIII까지 이 기능을 지원하지 않았지만 항상 지원되었습니다 -. 이는 실제로 옵션 구분자가 아니며 단지 옵션이 첫 번째 인수(예: for sh)만 고려한다는 점일 뿐이며 이는 -빈 옵션 목록입니다. .

관련 정보