Shellcheck는 bash 스크립트의 명령에 변수의 2개 인수를 전달하는 방법을 승인했습니다.

Shellcheck는 bash 스크립트의 명령에 변수의 2개 인수를 전달하는 방법을 승인했습니다.

Bash 스크립트에서 다른 프로그램을 호출하지만 명령줄 옵션을 사용하여 해당 프로그램을 구성하고 싶습니다. 다음은 작동합니다:

AREA_ARG=""
if __SOME_SETTING__ ; then
  AREA_ARG=" --area us,ca "
fi

process_data -i /some/path $AREA_ARG

즉, bash 실행 process_data -i /some/path또는 process_data -i /some/path --area us,ca.

하지만shellcheck불평하다!

$ shellcheck test.sh 

In test.sh line 7:
process_data -i /some/path $AREA_ARG
                           ^-------^ SC2086: Double quote to prevent globbing and word splitting.

Did you mean: 
process_data -i /some/path "$AREA_ARG"

For more information:
  https://www.shellcheck.net/wiki/SC2086 -- Double quote to prevent globbing ...

나는 진실을 이해하지만생각하다/필요2개의 인수를 얻기 위해 공간적으로 분할되는 변수입니다 process_data.

이를 수행하는 올바른 방법은 무엇입니까 bash?

답변1

배열 사용

배열을 사용하여 다시 작성한 코드는 다음과 같습니다. 또한 작업 예제( ls명령 대신)이며 올바른 변수 대/소문자를 사용합니다(코딩 표준에서는 대문자 이름이 시스템에 예약되어 있음을 나타냄).

#!/bin/bash

area_args=()
if true ; then
  area_args=(-l -a)
fi

ls "${area_args[@]}"

답변2

특정 사용 사례에 대한 더 간단한 답변이 있습니다.

unset -v area
if __SOME_SETTING__; then
  area="ca,us"
fi

process_data -i /some/path ${area+ --area "$area" }

어떤 이유로 인해 배열을 사용할 수 없는 경우그리고위의 사례에서 제공하는 것보다 더 많은 제어가 필요한 경우 함수 래퍼 사용을 고려할 수 있습니다.

withOptionalArea() {
  if __SOME_SETTING__; then
    "$@" --area us,ca
  else
    "$@"
  fi
}

withOptionalArea process_data -i /some/path

...하지만 이는 특별한 상황에서만 필요합니다.


실제로 배열을 사용하십시오.

답변3

임의의 명령이나 매개변수를 변수에 저장하는 올바른 방법은 배열을 사용하는 것입니다.변수에 저장된 명령을 어떻게 실행할 수 있나요?

하지만 괜찮다고 확신하는 한 Shellcheck에게 있는 그대로를 좋아한다고 말할 수 있습니다(즉, 그대로 두어야 하는 공백이나 문제를 일으킬 수 있고 변경되지 않은 전역 문자가 없습니다). IFS이것을 망칠 수 있는 일로):

AREA_ARG=""
if __SOME_SETTING__ ; then
  AREA_ARG=" --area us,ca "
fi


# shellcheck disable=SC2086 # split on purpose
process_data -i /some/path $AREA_ARG

바라보다https://www.shellcheck.net/wiki/Directive

답변4

=많은 매개변수 구문 분석 라이브러리에서는 기호를 사용하여 긴 옵션 이름과 해당 값을 연결할 수 있습니다 . (여기에는 다음이 포함됩니다.누립크파서 및 Python 표준인수 구문 분석 중도서관. ) 이와 같은 프로그램을 호출하고 더 많은 일반성이 필요하지 않은 경우 다음을 사용할 수 있습니다.

AREA_ARG=--area=us,ca

관련 정보