为什么这个 IF 语句在命令行中有效,但在脚本中无效?

为什么这个 IF 语句在命令行中有效,但在脚本中无效?

以 root 身份在命令行上执行以下操作

if [[ -e /var/log/apache2/error.log ]]; then echo YES; fi
YES

然而,在脚本中,这并没有

if [[ -e /var/log/apache2/error.log ]]; then
    echo YES
fi

知道为什么会这样吗?我没有得到预期的输出或错误。

脚本的第一行是#!/bin/bash

由于该脚本是由 PHP 脚本(www-admin)调用的,我认为可能是由于文件权限所致,但 error.log 文件具有读取权限

-rw-r--r-- 1 root adm 1763810 Sep 17 09:02 /var/log/apache2/error.log

父文件夹权限

drwxr-xr-x  10 root root  4096 Mar 20  2019 var
drwxr-xr-x 5 root root 12288 Sep 17 06:25 log
drwxr-xr-x 2 root root       4096 Sep 17 06:25 apache2

PHP脚本如何调用bash脚本

$cmd = "sh myscript.sh";
$output = array();
$output = shell_exec($cmd);

该脚本在没有 IF 语句的情况下运行良好。

答案1

您正在使用 调用您的 bash 脚本sh。这通常是一个基本的 POSIX shell,例如dash.这[[不是 POSIX,它是一种 bashism(也存在于其他一些 shell 中),所以你sh不支持它:

$ dash -c "if [[ 10 -gt 8 ]]; then echo yeah; fi"
dash: 1: [[: not found

因此,要么更改您的脚本以使用标准[(无论如何您都没有使用任何特殊功能[[):

if [ -e /var/log/apache2/error.log ]; then
    echo YES
fi

或者更改 PHP 脚本并使用 bash 显式调用该脚本:

$cmd = "bash myscript.sh";

或者,由于您确实有一个#!/bin/bashshebang,并且假设脚本已设置可执行位,因此只需直接调用它即可:

$cmd = "./myscript.sh";

相关内容