将数组从BASH传递到PHP

时间:2019-03-09 18:22:36

标签: php bash shell

我正在使用Shell脚本列出桌面上的所有文件。下面是我的shell脚本:

 #! /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脚本:

<?php

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

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

我知道我的shell脚本看起来不正确,但是我尝试了多种语法,但找不到正确的语法。

4 个答案:

答案 0 :(得分:4)

只是避免同时使用两者,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 :(得分:1)

编辑:正如其他几个人指出的那样,有可能(而且通常更好)直接在php中获取文件名列表,而完全不涉及shell脚本。但是如果由于某些原因确实需要使用shell脚本...

由于unix文件名可以包含“ /”和ASCII NUL(字符#0)(文件路径可以包含“ /”)以外的任何字符,因此传递文件名列表的标准方法是使用NUL分隔符。从诸如ls之类的命令中获取文件名列表是很难的,因此最好仅使用原始通配符(例如*)并让其获取列表bash本身会获得列表。这部分的一点棘手的事情是,默认情况下,如果没有匹配的文件,shell只会在其中留下“ *”,而不是生成一个空列表,因此您要启用bash的nullglob选项,那就是仅限bash的功能(因此,请与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>";
}
?>

答案 2 :(得分:1)

您可以简单地使用glob

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

,现在您可以迭代并执行一组操作。

答案 3 :(得分:-1)

我认为,理想的解决方案是,如果您的shell脚本输出逗号分隔的列表,并且您的PHP代码如下所示:

<?php

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

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

那对你有用吗?