Проблема с вашим решением является то, что выход Shell Script фактически в переменной PHP $response
:
SHELL сценарий:
#!/bin/bash
echo "Before prompt"
read -p 'Enter a value: ' input
echo "You entered $input"
PHP скрипт:
<?php
$shell = shell_exec("./t.sh");
echo "SHELL RESPONSE\n$shell\n";
Результат от php t.php
:
$ php t.php
Enter a value: foo
SHELL RESPONSE
Before prompt
You entered foo
Вы сняли весь STDOUT
сценарий Shell.
Если вы хотите просто передать значения сценарию оболочки, то опция $option_string = implode(' ', $array_of_values);
будет работать, чтобы поместить параметры для сценария отдельно. Если вы хотите что-то немного более продвинутое (установка флагов, назначение вещей, и т.д.) попробуйте это (https://ideone.com/oetqaY):
function build_shell_args(Array $options = array(), $equals="=") {
static $ok_chars = '/^[-0-9a-z_:\/\.]+$/i';
$args = array();
foreach ($options as $key => $val) if (!is_null($val) && $val !== FALSE) {
$arg = '';
$key_len = 0;
if(is_string($key) && ($key_len = strlen($key)) > 0) {
if(!preg_match($ok_chars, $key))
$key = escapeshellarg($key);
$arg .= '-'.(($key_len > 1) ? '-' : '').$key;
}
if($val !== TRUE) {
if((string) $val !== (string) (int) $val) {
$val = print_r($val, TRUE);
if(!preg_match($ok_chars, $val))
$val = escapeshellarg($val);
}
if($key_len != 0)
$arg .= $equals;
$arg .= $val;
}
if(!empty($arg))
$args[] = $arg;
}
return implode(' ', $args);
}
Это будет о вашем наиболее полном решении для перехода к командной строке.
Если вы ищете способ запросить пользователя (в общем), я бы подумал о том, чтобы оставаться внутри PHP. Самый простой способ:
print_r("$question : ");
$fp = fopen('php://stdin', 'r');
$response = fgets($fp, 1024);
Или, для поддержки проверки на вопрос, Многоканальный, и только вызов на CLI:
function prompt($message = NULL, $validator = NULL, $terminator = NULL, $include_terminating_line = FALSE) {
if(PHP_SAPI != 'cli') {
throw new \Exception('Can not Prompt. Not Interactive.');
}
$return = '';
// Defaults to 0 or more of any character.
$validator = !is_null($validator) ? $validator : '/^.*$/';
// Defaults to a lonely new-line character.
$terminator = !is_null($terminator) ? $terminator : "/^\\n$/";
if(@preg_match($validator, NULL) === FALSE) {
throw new Exception("Prompt Validator Regex INVALID. - '$validator'");
}
if(@preg_match($terminator, NULL) === FALSE) {
throw new Exception("Prompt Terminator Regex INVALID. - '$terminator'");
}
$fp = fopen('php://stdin', 'r');
$message = print_r($message,true);
while (TRUE) {
print_r("$message : ");
while (TRUE) {
$line = fgets($fp, 1024); // read the special file to get the user input from keyboard
$terminate = preg_match($terminator, $line);
$valid = preg_match($validator, $line);
if (!empty($valid) && (empty($terminate) || $include_terminating_line)) {
$return .= $line;
}
if (!empty($terminate)) {
break 2;
}
if(empty($valid)) {
print_r("\nInput Invalid!\n");
break;
}
}
}
return $return;
}
Не вы хотите '$ string' быть передан как его фактическое значение? В настоящее время он передается как строка _ $ string_ значение. Используйте двойные кавычки в 'shell_exec (" ./ response.sh $ string ");' поэтому PHP может его проанализировать. Что касается Баша, я не имею понятия, поэтому я не стану его ответом. – DeDee
Я получаю следующую ошибку, когда я использую двойные кавычки: 'sh: 1: Синтаксическая ошибка: слово неожиданное (ожидающее") ")' – cooldood3490
Я знаю, что вы уже выбрали ответ, но мне было бы интересно, если вы ищете for - это просто возможность выбора параметров, если, возможно, вас больше интересует приглашение PHP-скрипта для ввода. – Mike