2013-12-12 144 views
2

此代码有什么问题?Shell - 表达式中的语法错误(错误标记为“0”)

if ((`date +%U` % 2 -eq 0)) 
then 
    VOLUME= "A" 
else 
    VOLUME="B" 
fi 

我得到了“表达式中的语法错误(错误标记为”0“)”eror。

+0

如果您需要帮助,请尽一切努力正确设置代码的格式。 –

+0

仅限于'sh' shell时才使用''(反引号)。查看为什么$(...)比'...'更好(反引号)? http://mywiki.wooledge.org/BashFAQ/082 –

回答

2

您需要使用$(...)语法使用命令替换。

你可以使用这个命令:

(($(date +%U) % 2 == 0)) && VOLUME="A" || VOLUME="B" 
+0

我不推荐使用'... && ... || ......在这种情况下 –

+0

这是为什么? – anubhava

+0

'foo && bar || baz'不等于'if foo;然后吧;其他baz; fi',请参阅http://mywiki.wooledge.org/BashPitfalls#cmd1_.26.26_cmd2_.7C.7C_cmd3 –

1

您的问题是算术测试(双括号)的情况下使用-eq运营商。

您需要Command Substitution $(…)

if (($(date +%U) % 2 == 0)); then VOLUME= "A" else VOLUME="B"; fi 

N.B:Why is $(…) preferred over `…` (backticks)?

+0

虽然使用反引号而不是'$(...)',但是$(。 ..)'可能更好,如果你有一个支持它的外壳。 –

+0

你不能重叠反衬,它们是一个可读性噩梦,只能用于非POSIX。虽然**'$()'是POSIX **,具有更好的可读性和其他优点(请参阅新的参考) –

0

试试这个。

case $(date +%U) in 
    *[02468]) VOLUME="A";; 
    *) VOLUME="B";; 
esac 

还请注意,=周围的空间是不允许的。

相关问题