在bash中声明数组时出现错误'Syntax error: "(" unexpected'

4

这个问题相同,但应该是不同的原因。

以下脚本:

#!/bin/sh
arr=("cat" "dog" "bird")

在交互模式下工作(Debian),但在由crontab调用时失败,显示如下:

/bin/sh: 2: /path/zero_check.sh: Syntax error: "(" unexpected

我尝试使用 #!/bin/bash 声明shebang,并用 declare -a arr=("cat" "dog" "bird") 声明数组,但没有效果。有什么想法吗?

1
你在crontab中如何调用你的脚本? - fedorqui
1
错误信息清楚地表明Bash实际上未被用于执行脚本。 - Some programmer dude
1
我尝试了两种shebang,但只是将脚本复制到不同的位置以解决错误。下面的解决方案有效。 - geotheory
bash或sh哪个更适合cron? - geotheory
1
@geotheory 这真的取决于你想做什么。如果你需要数组,那就用Bash吧。 - fedorqui
4个回答

6
这里的问题在于你正在使用这个shebang:
```bash #!/usr/bin/env bash ```
然而,在一些情况下,这个路径可能没有被正确设置,导致脚本无法执行。建议改为以下形式:
```bash #!/bin/bash ```
这样可以确保脚本能够正常执行。
#!/bin/sh

虽然数组是Bash特有的,但它不被shell所允许。

因此,要使其正常工作,请将脚本的shebang更改为Bash:

#!/bin/bash

5

在 crontab 条目中明确指定你的解释器。使用

bash /path/zero_check.sh

相比于
/path/zero_check.sh

2
如果脚本已经包含了#!/bin/bash头部,那么这不应该是问题。 - fedorqui
我想我刚刚在错误的位置复制了工作脚本。解决方案有效。 - geotheory
1
如果这是答案,那么你正在忽略脚本中的另一个问题。 :( - SaintHax
@SaintHax 同意;问题在于错误的 shebang 行(使用 /bin/sh 而不是 /bin/bash);通过使用 bash 来覆盖它只是隐藏了问题,最好修复 shebang(请参见 fedorqui 的答案)。 - Gordon Davisson

1

仅供文档参考,我有一个旧脚本需要运行,但是Shebang中有语法错误:

#/bin/bash

应该是

#!/bin/bash

当然还要检查脚本是否可执行。


是的!过去两天我一直很疯狂,因为我忘了感叹号。这挽救了我所剩无几的理智。 - David

0
非常相似的问题,与错误的bash函数声明有关。从命令行运行没有问题,但会导致cron失败...
function test () { ... }

Cron应该将错误保存在/var/mail中

我还建议使用"shellcheck"进行linting,因为它发现了我没有注意到的另一个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接