Передать массив из BASH в PHP - PullRequest
1 голос
/ 09 марта 2019

Я перечисляю все файлы на моем рабочем столе, используя скрипт оболочки. Ниже мой сценарий оболочки:

 #! /bin/bash

myFiles=`dir /home/chb-pc/Desktop`
#echo $myFiles;

count=0
for f in $myFiles
do 
    #echo $f 
    read myArray[$count] = f
    `expr $count + 1`
done

echo myArray

Приведенный выше скрипт выдаст список имен всех файлов. Мне нужно сохранить вывод в переменной и отправить его в PHP, где я буду зацикливать каждый файл в этой переменной и делать некоторые вещи.

Ниже приведен мой PHP-скрипт:

<?php

$output = shell_exec("sh /home/chb-pc/Desktop/files.sh");

foreach ($output as $files) {
    echo $files . "<br>";
}
?>

Я знаю, что мой сценарий оболочки кажется неправильным, но я попробовал другой синтаксис и не могу найти правильный.

Ответы [ 4 ]

4 голосов
/ 10 марта 2019

Просто избегайте использования обоих, PHP вполне способен перечислить каталог:

<?php
$dir = '/home/chb-pc/Desktop';
foreach (new DirectoryIterator($dir) as $fileInfo) {
    if($fileInfo->isDot()) continue;
    echo $fileInfo->getFilename() . "\n";
}

См .: http://php.net/manual/en/class.directoryiterator.php

1 голос
/ 10 марта 2019

Вы можете просто использовать glob

$fileList = glob('temp/*');

и теперь вы можете выполнять итерацию и выполнять набор действий.

1 голос
/ 10 марта 2019

РЕДАКТИРОВАТЬ: как отметили несколько других, возможно (и, как правило, лучше) получить список имен файлов непосредственно в php, вообще не задействуя сценарий оболочки. Но если вам нужно по какой-то причине использовать скрипт оболочки ...

Поскольку имена файлов unix могут содержать любой символ, кроме «/» и ASCII NUL (символ # 0) (а пути к файлам могут содержать «/»), стандартный способ передачи списков имен файлов заключается в разделителях NUL. Получить список имен файлов из такой команды, как ls, которая не использует чистый формат, как этот, сложно, поэтому лучше получить список, просто используя необработанный шаблон (например, *) и позволяя bash самому получить список. Одна небольшая хитрость в этой части заключается в том, что по умолчанию, если нет подходящих файлов, оболочка просто оставит там "*" вместо создания пустого списка, так что вы хотите, чтобы опция bash nullglob была включена, и это bash -only функция (так что запустите это с bash, а не только sh!).

#! /bin/bash

cd /home/chb-pc/Desktop || exit

shopt -s nullglob    # If there are no files, don't just print the "*"!
printf '%s\0' *      # Print each filename followed by a NUL

В php есть и другая хитрость: в списке есть NUL после каждого имени файла, включая последнее, но explode предполагает, что разделителями являются между элементами. В результате в конце массива появится пустой элемент, и вам нужно удалить его с помощью array_pop.

<?php
$output = explode("\x00", shell_exec('bash /home/chb-pc/Desktop/files.sh'));
array_pop($output);

foreach ($output as $files) {
        echo $files . "<br>";
}
?>
0 голосов
/ 09 марта 2019

Я думаю, что идеальным решением было бы, если бы ваш сценарий оболочки выводил список через запятую, а ваш PHP-код выглядел бы так:

<?php

$output = explode(',', shell_exec('sh /home/chb-pc/Desktop/files.sh');

foreach ($output as $files) {
    echo $files . "<br>";
}
?>

Может ли это работать для вас?

...