if 문을 기반으로 한 Bash 플래그

if 문을 기반으로 한 Bash 플래그

다음을 통해 여러 플래그를 사용하여 bash 스크립트를 호출합니다.

/home/username/myscript -a -b 76

이를 설명하기 위해 -a 플래그는 myscript에서 작업을 수행하고 -b 플래그는 myscript에서 일부 매개변수를 76으로 설정합니다.

이전에 정의된 변수를 기반으로 이러한 플래그를 조건부로 만들려면 어떻게 해야 합니까? 예를 들어, 특정 변수가 var=ON인 경우에만 -a 플래그를 사용하고 싶고, 그렇지 않으면 플래그를 사용하는 방법을 모릅니다. 나는 비슷한 것을 찾고 있습니다 :

var=ON
/home/username/myscript 
if [ "$var" == "ON" ]; then
-a
fi
-b 76

그러나 이 계획은 시행 이후 실행되지 않았다. 원하는 결과를 얻으려면 무엇을 사용할 수 있습니까?

답변1

배열로 명령을 작성할 수 있습니다.

#!/bin/bash
var=ON
cmd=( /home/username/myscript )   # create array with one element
if [ "$var" == "ON" ]; then
    cmd+=( -a )                   # append to the array
fi
cmd+=( -b 76 )                    # append two elements

그런 다음 실행하십시오.

"${cmd[@]}"

마지막 부분의 따옴표와 위 과제 주변의 괄호를 참고하세요. 구문은 보기 흉하지만 공백 등이 포함된 인수에 직면하면 작동합니다. (공백이 포함된 매개변수를 추가하려면 따옴표를 사용하세요. 예: cmd+=("foo bar"))

관련된, 덜 추악한 방법과 실패할 수 있는 방식:


여기처럼 선택적 매개변수가 있는 간단한 경우에는 대체 값으로 확장할 수 있습니다.

var=x
myscript ${var:+"-a"} -b 76

여기에 ${var:+foo}비어 있지 않으면 삽입하고(즉, 가 삽입됩니다) 비어 있거나 설정되지 않은 경우(, 또는) 아무것도 삽입하지 않습니다. 일반적인 인용 문제에 유의하시기 바랍니다.foovarvar=ONvar=FALSEvar=xvar=unset var

답변2

내가 올바르게 이해했다면:

var=ON
if [ "$var" = "ON" ]; then
    /home/username/myscript -a -b 76
else
    /home/username/myscript -b 76
fi

관련 정보