以下 shell 脚本有什么问题?我得到了
[: too many arguments
错误
#!/bash
var1=10;
var2=20;
if [ $var1 % 2 -eq 0 ] -a [ $var2 %5 -eq 0 ];
then
#something
fi
答案1
首先,该[
命令仅进行比较。您必须单独执行计算。例如:
var1mod=$((var1 % 2))
if [ $var1mod -eq 0 ]; then
但是,由于您似乎正在为 bash 编写脚本,因此您可以使用不同的命令并避免额外的步骤:
if (( var1 % 2 == 0 )); then
其次,您不能使用 链接命令-a
。这只能作为 的参数[
。但在它之外,您必须使用&&
。
三种不同的变体:
if [ $var1mod -eq 0 -a $var2mod -eq 0 ]; then
if [ $var1mod -eq 0 ] && [ $var2mod -eq 0 ]; then
if (( var1 % 2 == 0 )) && (( var2 % 2 == 0 )); then
if (( var1 % 2 == 0 && var2 % 2 == 0 )); then
永远记住,的语法if
很简单。这意味着in只是一个命令的名称,就像或 一样。if command; then command; fi
[
if [
ls
echo
答案2
您似乎将条件求值与算术求值混淆了。%
是算术求值中的运算符,而不是条件求值中的运算符。请参阅bash(1)
手册页部分以了解这些主题。[...]
用于条件求值,而((...))
用于算术求值。
更不用说你的 shebang 行是错误的,除非由于某种原因你在启动驱动器的根级别安装了 bash 的副本。
最后但并非最不重要的一点是,换行符与分号相同。在 shell 脚本中,您不需要用分号结束一行。分号的存在只是为了让您在一行中放置两个语句。
这是脚本的清理版本:
/bin/bash #!/bin/bash VAR1=10 VAR2=20 如果 (( (VAR1 % 2 == 0) && (VAR2 % 5 == 0) )); 然后 :#something (冒号无操作) 菲