将参数传递给从sh脚本中调用的php脚本的问题

时间:2016-02-25 13:24:06

标签: bash shell sh

我有以下.sh文件:

#!/bin/bash
php -f /test_folder/test.php dosomething
echo "test string"
test.php中的

var_dump($_SERVER['argv'])返回:

array(2) {
 [0]=>
  string(31) "/test_folder/test.php"
 [1]=>
  " string(12) "dosomething
}

由于" string(12) "dosomething部分而存在问题。引号不正确,脚本会错误地解析参数。

当我从sh文件中删除echo "test string"并再次运行时,我正确得到string(11) "dosomething"。问题似乎是php行后的换行符。 我在Windows上使用Notepad ++,编码是UTF8 - 这些都可能是个问题吗?

如何在不破坏脚本的情况下转到新行?

1 个答案:

答案 0 :(得分:1)

您的\r\n脚本中的 Windows风格的bash(CRLF)行结尾 - 可能只是一个,即就行了包含php调用。 [1]

我怀疑当您稍后向脚本添加行echo "test string"时,您使用的编辑器(或编辑器配置不同)与最初创建脚本的编辑器不同。

使用cat -et script.sh验证Windows行结尾是否存在:如果您在输出中看到^M$,则确实存在。{/ p>

解决此问题:

  • *.sh脚本转换为Unix \n - 仅限行结尾,然后重试;你有几个选择:

    • 使用实用程序dos2unix,如果已安装它(可通过许多平台的程序包管理器使用)。
    • 使用标准实用程序,例如awk;例如: -
      awk '{ sub("\r$", ""); print } script.sh > script-fixed.sh
    • 查看Notepad ++是否可以将现有文件转换为Unix行结尾。
      • 更新:@Alan(OP)报告可以通过Edit > EOL Conversion菜单项设置/转换行结尾。
  • 将来,在编辑Unix shell脚本时,请确保编辑器使用Unix样式的行结尾。

[1]如果所有行都有Windows行结尾,那么shebang行将无法工作,并且会调用您的脚本 - 假设它被标记为可执行文件并被调用直接 - 从根本上会失败/bin/bash^M: bad interpreter: No such file or directory