Execute o script bash do PHP com parâmetros - Colchetes causando problema

0

Eu tenho este PHP:

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

Que executa este script bash (exporta uma tabela para 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

Isso funciona bem. No entanto, quero que a consulta seja dinâmica da seguinte forma:

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

Se eu mudar meu bash assim:

#!/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

Embora tudo seja "idêntico", apresenta o seguinte erro:

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

Então, estou pensando que não está feliz com a forma como a consulta contém colchetes quando passada do PHP?

    
por Lee 18.06.2018 / 16:24

2 respostas

1

Transmitindo parâmetros para um script de shell do PHP.

É tudo sobre as "strings" e quando "aspas duplas" para expansão.

<?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";

?>

BTW: não testei este fragmento.

    
por 18.06.2018 / 20:27
0

Eu não sou um cara de PHP, mas parece que você precisa fazer algo como

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

O PHP tem uma função onde você pode chamar o comando e passar os argumentos separadamente?

some_exec_function("/csvexport.sh", $query, $table);  # ???
    
por 18.06.2018 / 17:44

Tags