연관 배열의 이스케이프 문자열(bash)

연관 배열의 이스케이프 문자열(bash)

매개변수를 사용하여 여러 프로시저를 실행하는 스크립트를 작성 중입니다. 가능한 한 간단하게 만들려면 다음 예를 고려하십시오.

programs=( "ls" "echo" )
declare -A parameters
parameters["ls"]="-l /tmp/foo"
parameters["echo"]="Hello"

for program in "${programs[@]}"
do
  $program ${parameters[$program]}
done

이 방법은 매개변수에 공백이 없으면 잘 작동합니다. 물론 문자열 이스케이프는 이전에 논의되었으므로 StackExchange 및 다른 페이지에서 찾을 수 있는 다양한 방법을 모두 시도했습니다. 그러나 연관 배열을 사용하는 경우에는 적합한 솔루션을 찾을 수 없습니다. 예를 들어, "/tmp/foo bar" 목록을 얻으려면 다음 중 어느 것도 필요하지 않습니다.

parameters["ls"]="-l /tmp/foo bar"

이것도 아니고

parameters["ls"]="-l \"/tmp/foo bar\""

이것도 아니고

parameters["ls"]="-l /tmp/foo\ bar"

예상대로 작동합니다. 마찬가지로 루프의 프로그램 호출 주위에 따옴표를 넣으십시오.

  $program "${parameters[$program]}"

또한 두 개의 인수(-l 및 path)가 하나의 인수로 해석되므로 작동하지 않습니다.

내가 찾은 가장 가까운 해결책이 게시물프로그램 호출에서는 각 매개변수마다 하나씩 여러 개의 개별 변수를 사용하는 것이 좋습니다. 그러나 내 사용 사례에서는 각 프로그램에 가변 개수의 매개변수가 필요하므로 이것이 불가능합니다. 그래서 연관 배열을 사용합니다.

경로명을 탈출하는 다른 방법이 있나요?

안드레아스 안부 인사

답변1

먼저 매개변수가 포함된 배열을 만듭니다.

그런 다음 배열 문자열 값을 찾아서 저장 declare -pparameters다음 이를 복원하여 다음과 같이 실제 배열로 사용합니다.

#!/bin/bash

programs=( "ls" "echo" )
declare -A parameters

arrayTmp=("-l" "/tmp/foo bar")
parameters["ls"]="`declare -p arrayTmp |sed -r "s,[^=]*='(.*)'$,\1,"`"

parameters["echo"]="Hello"

for program in "${programs[@]}";do
    echo "PROGRAM: $program"
    declare -a arrayTmp="${parameters[$program]}"
    $program "${arrayTmp[@]}"
    arrayTmp=()
done

관련 정보