2013-03-28 2 views
1

내가 원하는 것을 얻는 데 어려움이있는 것 같습니다. 기본적으로, 나는 따옴표와 \ 문자가있는 문자열이 할당 된 일련의 변수를 가지고있다. json이 파이썬 덤프 메소드를 사용하여 따옴표를 싫어하기 때문에 인용 부호를 제거하여 json 문서 안에 삽입하고 싶습니다.변수 치환 대체 따옴표

나는 그것이 쉬울 것이라고 생각했다. 문자를 쉽게 제거하는 방법을 결정한 다음 변수 대체를위한 간단한 for 루프를 작성하십시오. 그런 식으로 작동하지 않습니다.

내가 원한다.

"MESSAGE23"이라는 변수가 있는데, 다음과 같은 "com.centrify.tokend.cac"가 포함되어 있습니다. 쉽게 인용 할 수있는 따옴표를 제거하고 싶습니다. 간단한 echo $opt | sed "s/\"//g". 명령 줄에서 이렇게하면 :

$> MESSAGE23="com."apple".cacng.tokend is present" 
$> MESSAGE23=`echo $MESSAGE23 | sed "s/\"//g"` 
$> com.apple.cacng.tokend is present 

이것은 작동합니다. 올바른 형식의 문자열을 가져옵니다.

내가 루프에 던지려고하면 모든 지옥이 느슨해집니다.

for i to {1..25}; do 
    MESSAGE$i=`echo $MESSAGE$i | sed "s/\"//g"` 
done 

이 작동하지 않습니다 (중 하나가 인덱스의 무리 밖으로 또는 아무것도를 throw), 그리고 난 그냥 arg 또는 eval 또는 다른 bash는 대체 변수에 대해 충분히 알고하지 않습니다 확신 해요.

하지만 기본적으로 동일한 문제가있는 다른 변수 집합에 대해이 작업을 수행하려고합니다. 여기서 따옴표를 제거하고 우연히 "\"도 제거합니다.

도움을 주시면 감사하겠습니다.

답변

3

당신은 그렇게 할 수 없습니다. 당신은 eval을 사용하여 작동하게 만들 수 있습니다. 그러나 그것은 당신이 걱정해야 할 또 다른 수준의 인용을 소개합니다. 배열을 사용할 수없는 이유가 있습니까?

MESSAGE=("this is MESSAGE[0]" "this is MESSAGE[1]") 
MESSAGE[2]="I can add more, too!" 
for ((i=0; i<${#MESSAGE[@]}; ++i)); do 
    echo "${MESSAGE[i]}" 
done 

그렇지 않으면이 같은 필요

eval 'echo "$MESSAGE'"$i"'"' 

을하고 그냥 거기에서 악화된다.

+0

yuck .. 아니, 배열 사용에 반대하지 않습니까? 나는 MESSAGE1-25라는 변수를 가지고 있는데, 각각을 배열에 푸시 한 다음 각각을 꺼내서 대체해야합니까? 나는이 배열을 어디에 두어야하는지 잘 모르겠다. –

+0

오 .. 알았어. MESSAGE는 해당 배열에 배열 및 팝 값입니다. –

+0

Right. 'MESSAGE1 = blah1','MESSAGE2 = blah2' 등 대신'MESSAGE [0] = blah1','MESSAGE [1] = blah2' 등을 할 수 있습니다. 또는 모든 것을 괄호로 초기화 할 수 있습니다. 또는'read -a'를 사용하여 파일에서 읽어 들이기 만하면됩니다. 단지 변수가 어떻게 응용 프로그램에 설정되는지에 달려 있습니다. –

1

우선, 몇 가지 예비 문제 : MESSAGE23="com."apple".cacng.tokend is present"은 변수 값에 큰 따옴표를 포함하지 않으므로 대신 MESSAGE23="com.\"apple\".cacng.tokend is present" 또는 MESSAGE23='com."apple".cacng.tokend is present'을 사용하십시오. 둘째로, 변수 확장 (예 : echo "$MESSAGE23")에 항상 큰 따옴표를 넣어 구문 분석의 기이함을 방지해야합니다.

실제 문제 : 쉘에서 과제의 왼쪽에 변수를 대체 할 수 없습니다 (예 : MESSAGE$i=something). 다행히도 declare 문에서 이것을 허용하므로 대신 사용할 수 있습니다. 또한 $MESSAGE$i으로 바뀌면 $MESSAGE 값 다음에 $i 값이 바뀝니다. 이것을 위해 간접 확장 (`$ {! metavariable} ')을 사용해야합니다.

for i in {1..25}; do 
    varname="MESSAGE$i" 
    declare $varname="$(echo "${!varname}" | tr -d '"')" 
done 

(나는 또한 sed 대신 tr를 사용합니다,하지만 그건 그냥 내 개인적인 취향입니다.)

(또한, 배열의 @ 마크 리드의 제안은 정말이 할 수있는 더 좋은 방법이므로주의 말하자면.)

+0

고마워요. .. 너희 둘 모두에게서 배웠다. 배열 옵션과 선언을 사용하여 실험해볼 것이다. 감사 –