배열로 저장된 명령 실행(인수에는 공백이 포함될 수 있음)

배열로 저장된 명령 실행(인수에는 공백이 포함될 수 있음)

이 예를 적용하려고 할 때이 답변

mycmd=(ls)               # initial command
if [ "$want_detail" = 1 ]; then
    mycmd+=(-l)          # optional flag
fi
mycmd+=("$targetdir")    # the filename

"${mycmd[@]}"

나는 그것을 알아

mycmd=(python3 /tmp/test.py)
A="a value"
B="b value"
ARGS="-a ${A} -b ${B}"
mycmd+=("$ARGS")
"${mycmd[@]}"

원래 예에서 와 같이 각 플래그를 개별적으로 추가하지 않는 이유 mycmd+=(-l)는 플래그가 9개이므로 각 플래그와 해당 값을 별도의 줄(18개 추가 줄)에 추가하지 않으려고 하기 때문입니다.

문제는 test.py매개변수를 단일 문자열로 수신하는 데 있습니다. 또한 매개변수 값에 공백이 포함될 수 있으므로 다른 문제에 직면할 수도 있다고 생각합니다(이 문제를 해결할 수 있을까요 ARGS="-a \"${A}\" -b \"${B}\""?).

$ bash -x /tmp/test.sh
+ mycmd=(python3 /tmp/test.py)                          
+ A='a value'                                           
+ B='b value'                                           
+ ARGS='-a a value -b b value'                          
+ mycmd+=("$ARGS")                                      
+ python3 /tmp/test.py '-a a value -b b value'          
usage: test.py [-h] -a A -b B                           
test.py: error: the following arguments are required: -b

답변1

각 플래그를 개별적으로 추가하지는 않을 것입니다 ...

그것이 문제이다. 별도의 매개변수를 하나로 압축하면 여기서 배열 사용의 전체 요점을 무효화할 수 있습니다.

각 플래그와 해당 값을 별도의 줄에 추가하지 않으려고 합니다...

그런 다음 다음과 같이 하십시오:

mycmd+=(-a "$A") 
# or
mycmd+=(-a "$A" -b "$B")

관련 정보