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