我正在使用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脚本看起来不正确,但是我尝试了多种语法,但找不到正确的语法。
答案 0 :(得分:4)
只是避免同时使用两者,PHP完全有能力列出目录:
<?php
$dir = '/home/chb-pc/Desktop';
foreach (new DirectoryIterator($dir) as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "\n";
}
答案 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>";
}
?>
那对你有用吗?