큰따옴표가 포함된 매개변수를 쉘 스크립트 함수에 전달하는 방법은 무엇입니까?

큰따옴표가 포함된 매개변수를 쉘 스크립트 함수에 전달하는 방법은 무엇입니까?

내 pull_news.sh에서(변수 선언은 생략됨):

dump_table () {
   mysqldump --user=${REMOTE_USERNAME} --password=${REMOTE_PASSWORDS} --host=${REMOTE_HOST} --port=${REMOTE_PORT} --single-transaction --lock-tables=false $@
}

pull_news(){
    dump_table --set-gtid-purged=OFF --where="INFOCODE IN (SELECT INFOCODE FROM info_an_newsrelation WHERE MKTPOSTFIX = '.OC')" ${REMOTE_DBNAME} info_an_newscontent > ${DUMPFILE}
}

pull_news

뒤쪽에

$ ./pull_news.sh

나는 가지고있다

mysqldump: Got error: 1044: Access denied for user 'user'@'%' to database 'in' when selecting the database

INwhere 절을 제거하면 문제가 사라지므로 알 수 없는 이유로 쉘은 where 절의 첫 번째 단어만 취하고 두 번째 단어( the )를 Name 데이터베이스로 구문 분석하는 것 같습니다 .

그런 다음 나는 그것을 대체했습니다.

--where="\"INFOCODE IN (SELECT INFOCODE FROM info_an_newsrelation WHERE MKTPOSTFIX = '.OC')\""

그러나 성공하지 못했습니다. 지금은 무엇을 해야할지 모르겠습니다. 어떤 도움이라도 주시면 정말 감사하겠습니다...

답변1

인용되지 않은 것이 $@문제입니다. 함수의 모든 매개변수로 확장된 다음 이를 준수하게 만듭니다.분사(및 와일드카드). 따옴표로 묶으세요:

dump_table () {
   mysqldump --user=... --lock-tables=false "$@"
}

"${REMOTE_USERNAME}"원칙적으로 다른 변수도 따옴표로 묶어야 합니다( ). 사용자 이름과 데이터베이스 이름에 공백(또는 와일드카드)이 포함될 가능성은 거의 없습니다.

실제로 매개변수로 전달하는 문자열에는 큰따옴표가 포함되어 있지 않습니다. 쉘이 인용(제거)을 수행한 후에는 단지 문자열일 뿐이므로 --where=INFOCODE IN (SELECT ... = '.OC')다른 함수를 통하지 않고 직접 시작하면 이를 볼 수 있습니다. 그렇게 유지 mysqldump하려면 따옴표를 추가하세요 ."$@"

물론 제목의 질문에 대한 답변으로 다른 명령과 마찬가지로 백슬래시로 이스케이프하거나 작은따옴표로 묶어 리터럴 큰따옴표를 전달할 수 있습니다.

somefunc "their name was \"$name\"" 
somefunc 'their name was "John"'

관련 정보