Для добавления ответа, который указывает на надежный раздел в документации :
Учитывая выражение среза, подобное s[i:j:k]
,
Срез s от i до j с шагом k определяется как последовательность элементов с индексом x = i + n * k, такая, что 0 & lt; = n & lt; (J-я) / к. Другими словами, индексы i, i + k, i + 2 * k, i + 3 * k и т. Д., Останавливаясь, когда j достигнуто (но никогда не включает j). Когда k положительно, i и j сведены к len (s), если они больше
blockquote>, если вы пишете
s[999:9999]
, python возвращаетs[len(s):len(s)]
сlen(s) < 999
и ваш шаг (1
- значение по умолчанию).
Вы всегда должны экранировать переменные, которые подставляете в командные строки, и PHP предоставляет функцию escapeshellarg()
для этого.
$output = shell_exec("/path/to/bash/script.sh " . escapeshellarg($filechosen));
или
$escaped = escapeshellarg($filechosen);
$output = shell_exec("/path/to/bash/script.sh $escaped");
В GNU / Linux обычным способом команд является обработка потоков. Также grep
делает это. По возможности, вы не должны нарушать эту схему. В вашем конкретном примере нет смысла заключать его в позиционные параметры.
Вы можете использовать popen
для записи потока в исполняемую команду:
<pre>
<?php
$filechosen = <<<_EOS_
*
*clefF4
*k[f#c#g#d#a#]
*d:
*M6/4
_EOS_;
if($handle = popen("grep 'k\\['", "w"))
{
fwrite($handle, $filechosen);
pclose($handle);
}
?>
<pre>
Вместо этого используйте функцию proc_open
, когда хотите прочитать выходной поток в переменную.
if($handle = proc_open("grep 'k\\['", [['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']], $streams))
{
[$stdin, $stdout, $stderr] = $streams;
fwrite($stdin, $filechosen);
fclose($stdin);
$output = stream_get_contents($stdout);
fclose($stdout);
$error = stream_get_contents($stderr);
fclose($stderr);
proc_close($handle);
echo $output;
}