매개변수를 사용하여 PHP에서 bash 스크립트 실행 - 대괄호로 인해 문제가 발생함

매개변수를 사용하여 PHP에서 bash 스크립트 실행 - 대괄호로 인해 문제가 발생함

나는 이 PHP를 가지고 있습니다 :

exec("/csvexport.sh $table");

다음 bash 스크립트를 실행합니다(테이블을 CSV로 내보냅니다).

#!/bin/bash
table=$1

mysql --database=db --user=user --password=pass -B -e "SELECT field1, field2, IF(field3 = '0000-00-00','0001-01-01',field3) AS field3 FROM mytable;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > /home/backups/$table.csv

이것은 훌륭하게 작동합니다. 그러나 나는 쿼리가 다음과 같이 동적이기를 원합니다.

$query = "SELECT field1, field2, IF(field3 = '0000-00-00','0001-01-01',field3) AS field3 FROM mytable;";
exec("/csvexport.sh $query $table");

bash를 다음과 같이 변경하면 :

#!/bin/bash
query=$1
table=$2

mysql --database=db --user=user --password=pass -B -e "$query" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > /home/backups/$table.csv

모든 것이 "동일"하더라도 다음 오류가 발생합니다.

sh: -c: line 0: syntax error near unexpected token `('

그렇다면 PHP에서 전달된 쿼리에 대괄호가 포함된 방식이 마음에 들지 않는 것 같습니다.

답변1

PHP에서 쉘 스크립트로 매개변수를 전달합니다.

그것은 "문자열"과 확장을 위해 "큰따옴표"를 언제 사용해야 하는지에 관한 것입니다.

<?php

/* exec("/csvexport.sh $table"); */

/* double quote here because you want PHP to expand $table */
/* Escape double quotes so they are passed to the shell because you do not wnat the shell to choke on spaces */
$command_with_parameters = "/path/csvexport.sh \"${table}\"";
$output_from_command = "";
$command_success = "";

/* double quote here because you want PHP to expand $command_with_parameters, a string */
exec("${command_with_parameters}", $output_from_command, $command_success);

/* or to keep it simple */
exec("/path/csvexport.sh \"${table}\"");


/* show me what you got */
echo"${command_success}\n${output_from_command}\n";

?>

참고: 저는 이 조각을 테스트하지 않았습니다.

답변2

저는 PHP 전문가는 아니지만 다음과 같은 작업을 수행해야 할 것 같습니다.

exec(escapeshellcmd("/csvexport.sh \"$query\" $table"));

명령을 개별적으로 호출하고 인수를 전달할 수 있는 함수가 PHP에 있습니까?

some_exec_function("/csvexport.sh", $query, $table);  # ???

관련 정보