2012-03-01 2 views
11

내가 위의배쉬 중첩 지수 및 평가

argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 
eval $argv 

떠들썩한 파티 스크립트에서 어려움이 중첩 된 따옴표가 있어요

eval: line 162: unexpected EOF while looking for matching `'' 
eval: line 163: syntax error: unexpected end of file 

답변

12
argv="su -c \"$RVM_PATH wrapper $config_rvm \\\"$PASSENGER_RVM_BIN $command $options\\\"\" web" 
6

Use an array instead.

#!/bin/bash 
cmd=(echo "foo bar") 
"${cmd[@]}" 
+0

내가 제공 한 링크가 bash 배열의 제안 된 사용에 대해 설명하는지 모르겠습니다. –

+0

@TomHale : 제 답변에 문법 버그가 있습니다. –

9

나에게 가지고 있기 때문에 \' 아무튼 ' 작은 따옴표로 묶인 문자열에는 특별한 의미가 없습니다. 단순히 "백 슬래시 (backslash), 문자열의 끝"을 의미합니다.

하나의 옵션은 '... '대신에 $'...''을 사용하는 것입니다. 백 슬래시 이스케이프를 사용할 수 있습니다. 그 결과는 다음과 같습니다

argv="su -c $'$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 

단점은 $RVM_PATH, $config_rvm가, 또는 다른 변수 중 하나가 백 슬래시를 포함 할 수있는 기회가 있다면, 그것은 너무 백 슬래시 - 탈출을 도입하는 것으로 해석 될 수 있다는 점이다.