我有以下.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 - 这些都可能是个问题吗?
如何在不破坏脚本的情况下转到新行?
答案 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
Edit > EOL Conversion
菜单项设置/转换行结尾。将来,在编辑Unix shell脚本时,请确保编辑器使用Unix样式的行结尾。
[1]如果所有行都有Windows行结尾,那么shebang行将无法工作,并且会调用您的脚本 - 假设它被标记为可执行文件并被调用直接 - 从根本上会失败/bin/bash^M: bad interpreter: No such file or directory