2012-02-01 4 views
2

문제 :문자열 확장

예상 된 결과를 생성하지 않습니다 다음 쉘 스크립트 코드 :

# MYSQL, MyUSER MyHost etc ... all defined above as normal 

TARG_DB="zztest"; 
DB_CREATE="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'create database $TARG_DB')"; 

예상 결과 :

만든 새 데이터베이스 이름이 zztest

실제 결과 : 이름으로 작성

새로운 데이터베이스 $TARG_DB

질문 :

방법이 예제 코드는 예상 결과를 제공 $TARG_DB 보간 또는 확장되도록 변경 될 수 있습니다? $TARG_DB는 서브 쉘 내에서 작은 따옴표 내에 있기 때문에

답변

6

, 그것은 문자 그대로입니다. 큰 따옴표를 사용하면 하위 쉘을 엉망으로 만들지 않습니다. 예 :

$ tmp="a b c" 
$ echo $tmp 
a b c 
$ echo $(echo $tmp) 
a b c 
$ echo $(echo "$tmp") 
a b c 
$ echo $(echo '$tmp') 
$tmp 
$ echo "$(echo '$tmp')" 
$tmp 
$ echo "$(echo "$tmp")" 
a b c 
+0

위대한 답변, 직접 : 예를 들어. 감사. – dreftymac

+0

덧붙여 말하자면, 스택 오버플로는 따옴표를 잘못 해석하여 (답변을 오인하는 것입니다) 괜찮은 편집자가 명령 대체를 알고 올바르게 강조 표시합니다. – Cuadue

0
TARG_DB="zztest"; 
DB_CREATE="$(${MYSQL} -u ${MyUSER} -h ${MyHOST} -p${MyPASS} -Bse \"create database ${TARG_DB}\")"; 
+1

서브 쉘에 있기 때문에 따옴표를 이스케이프 처리 할 필요가 없습니다. – Kevin

+0

@Kevin 네 말이 맞아. – sgibb

2

작은 따옴표로 묶지 마십시오.

$() 명령 대체를 따옴표로 묶을 필요가 없으므로이를 제거하고 그 안에 큰 따옴표를 사용할 수 있습니다.

DB_CREATE=$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse "create database $TARG_DB"); 
0

'create database $TARG_DB' 부분이 잘못되었습니다. 작은 따옴표는 bash에서 변수 치환을 억제합니다. MySQL은 리터럴 텍스트 "$ TARG_DB"를 "보고"그 이름을 가진 데이터베이스를 생성합니다. SQL 문을 큰 따옴표로 묶으십시오.

관련 문제