매개변수가 하나만 설정된 경우 bash 매개변수 수정

매개변수가 하나만 설정된 경우 bash 매개변수 수정

나는스크립트표준으로getopt마법, 스크립트를 호출할 수 있습니다.

batman-connect -c ffki

대시 없이 단 하나의 옵션으로 이 스크립트를 호출하는 옵션을 추가하려면 어떻게 해야 합니까?

batman-connect ffki

-c따라서 이 유일한 옵션을 ?의 두 번째 인수 로 해석합니다 .

~에 따르면이 답변나는 시도했다:

if [ $@ = "ffki" ]; then
  set -- "-c $@"
fi

하지만 이것은 내 라인 때문에 오류가 발생한다고 생각합니다.스크립트다음으로 다시 변경하세요.

# Execute getopt on the arguments passed to this program, identified by the special character $@
PARSED_OPTIONS=$(getopt -n "$0"  -o hsrvVi:c: --long "help,start,restart,stop,verbose,vv,version,interface:,community:"  -- "$@")

전체 스크립트를 재정렬하는 것을 좋아하지 않습니다. 첫 번째 매개변수를 "-c"로 설정하고 두 번째 매개변수를 "ffki"로 설정하는 간단한 한 줄이 있습니까?

답변1

당신은 다음과 같은 것을 할 수 있습니다

if [ $# = 1 ]; then
    # do whatever you'd do when there is only one argument
else
    # do the getopt bits
fi
# do what you'd do in either case

-c가 지원하려는 유일한 스위치인 경우 getopt가 필요하지 않으며 다음과 같이 수행할 수 있습니다.

#!/bin/bash

usage() {
    echo "Usage: $0 [ -c ] arg" >&2
    exit 1
}

if [ $# = 2 ]; then
    if [ $1 = "-c" ]; then
        shift
        c_switch_value="$1"
    else
        usage
    fi
elif [ $# = 1 ]; then
    c_switch_value="$1"
else
    usage
fi

이것이 더 읽기 쉬운지 여부는 논쟁의 여지가 있습니다.

답변2

이 스크립트의 시작 부분에 다음을 추가했습니다.

if [ $# = 1 ]; then
  # If there is only one argument, replace the current process with the new invocation of the script
  # the only option will be used as -c option
  exec "$0" -c "$@"
fi

이것은 원래 질문에 대한 답변은 아니지만 내 특별한 경우에 적합한 해결 방법입니다.

답변3

if [ $@ = "ffki" ]; then

절의 명령은 위치 인수를 구성하는 단어의 와일드카드 확장 목록으로 if확장되고 그 뒤에 단어가 옵니다 . 일반적으로 큰따옴표 밖에 있으면 "값 "을 의미하는 것이 아니라 "값을 별도의 단어로 분할하여 와일드카드로 해석함"을 의미합니다. 바라보다[= ffki ]$VARVARVAR공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?

특별한 경우 도 있습니다 "$@". 개별 단어(따옴표에도 불구하고)가 아니라 위치 인수 목록(추가 확장 없이)으로 확장됩니다. 공백으로 구분된 위치 인수로 구성된 단일 단어로 확장되는 를 사용할 수 있습니다 "$*"(보다 정확하게는 값의 첫 번째 문자로 구분됨 IFS). 따라서 값이 있는 단일 위치 매개변수가 있는지 테스트하려면 ffki다음을 사용할 수 있습니다.

if [ "$*" = "ffki" ]; then

또는 위치 매개변수의 수를 계산하고 해당 값을 개별적으로 테스트할 수 있습니다. 예를 들어 값에 공백이 포함되도록 하려면 이 작업이 필요합니다.

if [ $# -eq 1 ] && [ "$1" = "ffki" ]; then

위치 매개변수를 변경하려면 이미 완료되었습니다. set내장 함수를 사용하고 새로운 위치 매개변수 세트를 별도의 인수로 전달하세요. 첫 번째 인수가 Something으로 시작될 위험이 있는 경우 옵션으로 해석되지 않도록 -이를 사용하세요 .set -- …

if [ "$*" = "ffki" ]; then
  set -- -c "ffki"
fi

답변4

아마도 다음과 같은 것을 원할 것입니다.

# getopt code that sets "$c_value" goes here ...
# ... then
if [[ -z $c_value ]] && (( $# > 0 )); then
    c_value=$1
    shift
fi

관련 정보