我从来没有在bash中编程......但我试图解决游戏中的成就问题(codingame.com)
我有以下代码:
for (( i=0; i<N-1; i++ )); do
tmp=$(( sorted_array[i+1] - sorted_array[i] ));
if [ $tmp < $result ]; then result=$tmp fi
done
这个错误:
/tmp/Answer.sh: line 42: syntax error near unexpected token `done'at Answer.sh. on line 42
/tmp/Answer.sh: line 42: `done' at Answer.sh. on line 42
我想比较我的数组的相邻值并存储它们之间的最小差异......但我不知道如何在bash中执行If语句
答案 0 :(得分:16)
必须通过换行符或分号正确终止每个命令。在这种情况下,您需要将result
的分配与关键字fi
分开。尝试添加分号;
for (( i=0; i<N-1; i++ )); do
tmp=$(( sorted_array[i+1] - sorted_array[i] ))
if [ $tmp -lt $result ]; then result=$tmp; fi
done
此外,您需要使用lt
而不是<
,因为<
是重定向运算符。 (除非您打算使用来自变量$tmp
命名的文件的输入来运行名为$result
的命令)
答案 1 :(得分:7)
您缺少分号,需要使用-lt
代替<
,正如其他人指出的那样。
if
语句的替代方法是使用逻辑和运算符&&
:
for (( i=0; i<N-1; i++ )); do
tmp=$(( sorted_array[i+1] - sorted_array[i] ))
[ $tmp -lt $result ] && result=$tmp
done
答案 2 :(得分:-1)
您的if
需要遵循fi
命令,但您没有任何此类命令。您的代码中有一个fi
,但它位于另一个命令的中间,因此不再完成if
,fi
中的echo fi
将完成。如果您要将行合并在一起,则需要使用分号来分隔命令。
所以崩溃
for (( i=0; i<N-1; i++ ))
do
tmp=$(( sorted_array[i+1] - sorted_array[i] ))
if [ $tmp -lt $result ]
then
result=$tmp
fi
done
您使用
for (( i=0; i<N-1; i++ )); do
tmp=$(( sorted_array[i+1] - sorted_array[i] ))
if [ $tmp -lt $result ]; then result=$tmp; fi
done
异常:do
和then
后面可以跟一个命令,所以当你合并到下一行时,你不需要在它们后面加分号。
请注意您是否需要使用;
终止命令?仅在命令之间需要;
。
在test
([]
)内,-lt
用于比较数字。