Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数组从BASH传递到PHP_Php_Bash_Shell - Fatal编程技术网

将数组从BASH传递到PHP

将数组从BASH传递到PHP,php,bash,shell,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 上面的脚本将列出所有文件的文件名。 我需要将输出存储在一个变量

我正在使用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

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

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

我知道我的shell脚本似乎不正确,但我尝试了各种语法,却找不到正确的语法。

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

<?php

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

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

这对您有用吗?

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

<?php

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

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

这对您有用吗?

编辑:正如其他几个人指出的那样,直接用php获取文件名列表是可能的,而且通常更好,根本不需要使用shell脚本。但是如果出于某种原因需要使用shell脚本

由于unix文件名可以包含除/和ASCII NUL字符0之外的任何字符,并且文件路径可以包含/,因此传递文件名列表的标准方式是使用NUL分隔符。从像ls这样的命令中获取文件名列表是很困难的,它不使用像这样干净的格式,因此最好只使用原始通配符(例如*)并让bash自己获取列表。这一部分中有一个稍微棘手的问题是,默认情况下,如果没有匹配的文件,shell将只保留*而不是生成一个空列表,因此您希望启用bash的nullglob选项,而这是一个仅限于bash的特性,所以请使用bash而不仅仅是sh!运行此功能

在php中捕获这一点还有一点棘手:列表在每个文件名后都有一个NUL,包括最后一个文件名,但explode假设分隔符在项目之间。因此,它会在数组的末尾出现一个空项,您需要使用array_pop删除该项


编辑:正如其他一些人所指出的,直接在php中获取文件名列表是可能的,而且通常更好,根本不涉及shell脚本。但是如果出于某种原因需要使用shell脚本

由于unix文件名可以包含除/和ASCII NUL字符0之外的任何字符,并且文件路径可以包含/,因此传递文件名列表的标准方式是使用NUL分隔符。从像ls这样的命令中获取文件名列表是很困难的,它不使用像这样干净的格式,因此最好只使用原始通配符(例如*)并让bash自己获取列表。这一部分中有一个稍微棘手的问题是,默认情况下,如果没有匹配的文件,shell将只保留*而不是生成一个空列表,因此您希望启用bash的nullglob选项,而这是一个仅限于bash的特性,所以请使用bash而不仅仅是sh!运行此功能

在php中捕获这一点还有一点棘手:列表在每个文件名后都有一个NUL,包括最后一个文件名,但explode假设分隔符在项目之间。因此,它会在数组的末尾出现一个空项,您需要使用array_pop删除该项


只要避免使用这两种方法,PHP就可以列出目录:


只要避免使用这两种方法,PHP就可以列出目录:

您可以简单地使用glob

$fileList=glob'temp/*'; 现在您可以迭代并执行一组操作

您可以简单地使用glob

$fileList=glob'temp/*';
现在您可以迭代并执行一组操作

您的bash脚本根本不起作用,至少在Debian上是这样,因为read是从stdin读取的命令,为什么不在PHP中使用glob呢?我不知道这个函数。谢谢你的建议。这让生活变得更简单。至少在Debian上,bash脚本根本不起作用,因为read是从stdin读取的命令,为什么不在PHP中使用glob呢?我不知道这个函数。谢谢你的建议。这使生活更简单。可能是因为列出的是文件名,所以使用\n作为分隔符会更好。。。否则,您将不得不从文件名中转义逗号。bash脚本可能会被一个简单的find/my/dir替换使用\n作为分隔符也意味着您必须对包含换行符的文件进行转义,最好是\0,因为文件不允许包含该字符可能是因为列出的文件名,最好使用\n作为分隔符。。。否则,您将不得不从文件名中转义逗号。bash脚本可能会被一个简单的find/my/dir替换,使用分隔符\n还意味着您必须对包含换行符的文件进行转义,最好是\0,因为文件不允许包含该字符检查目录here/home/chb pc/Desktop | | exit不起作用,您不能执行目录。[[-d/home/chb-pc/Desktop]| |退出可以工作,但最好是退出
enable set-e最好是set-euo pipefail,只需将cd放入目录cd/home/chb pc/Desktop,如果目录不存在,则由于set-e将退出脚本。@lyte D'oh,这是一个复制粘贴错误;它应该是一个cd命令,如果cd因任何原因失败,则退出脚本。现在已修复。公平地说,现在更有意义了检查此处/home/chb pc/Desktop | | | exit目录不起作用,您无法执行目录。[[-d/home/chb pc/Desktop]]| | exit可以工作,但更好的方法是启用set-e,最好是set-euo pipefail,只需将cd放入目录cd/home/chb pc/Desktop,如果目录不存在,则会由于set-e退出脚本。@lyte d'oh,这是一个复制粘贴错误;它应该是一个cd命令,如果cd因任何原因失败,则退出脚本。现在修好了。很公平,现在更有意义了
<?php
$output = explode("\x00", shell_exec('bash /home/chb-pc/Desktop/files.sh'));
array_pop($output);

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