将数组从BASH传递到PHP
我正在使用shell脚本列出桌面上的所有文件。下面是我的shell脚本:将数组从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 上面的脚本将列出所有文件的文件名。 我需要将输出存储在一个变量
#! /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>";
}
?>