Bash shell脚本中的模数函数

7
for ((i=0; i<lenPT; i++)) do 
    if [[ $(($lenPT % 2))  == 0]] then
        P[i] = "$((K [0] * arrT[i] + K[2] * arrT[i+1]))" 
    else
        P[i] = "$((K[1]*arrT[i-1]+K[3]*arrT[i]))"
    fi
done

我收到了错误提示,显示"条件表达式中的语法错误""then附近的语法错误"。我的条件语句出了什么问题?


2
请看:http://www.shellcheck.net/ - Cyrus
3个回答

11

注意空格的重要性,请参见 Barmar 的答案。如果你想让 then[[ ]] 条件放在同一行,还需要在分号后加上一个分号。

可以使用(仅限 Bash)(( )) 条件语句,其内容在算术上下文中进行评估,而不是繁琐的 [[ $(( )) ... ]] 组合:

if ((lenPT % 2 == 0)); then

在这个结构中,你甚至不需要$lenPTlenPT就已经足够了(详情请参见手册中的条件结构)。

由于((...))的退出状态为1(不成功),如果表达式计算为0,则为0(成功),因此您可以交换分支并缩短条件:

if ((lenPT % 2)); then
    P[i]=$((K[1] * arrT[i-1] + K[3] * arrT[i]))
else
    P[i]=$((K[0] * arrT[i] + K[2] * arrT[i+1]))
fi

5

]]前需要加一个空格。

   if [[ $(($lenPT % 2)) == 0 ]]; then

3

取决于$lenPT值的if ... else是不必要的,因为$lenPT在循环内永远不会改变。两个赋值非常相似,if逻辑可以用算术运算替换。例如:

n=$((lenPT % 2))
for ((i=0; i<lenPT; i++)) 
do      
    P[i]="$((K[n] * arrT[i-n] + K[2+n] * arrT[i+1-n]))"
done 

你的逻辑处理非常聪明,但你还没有解决问题。将你的逻辑处理与Benjamin W.和Barmar的答案整合,最终结果会很完美 :) - 南山竹
for循环中的赋值语句存在语法错误。 - Benjamin W.
@BenjaminW。你是对的,它在数组索引计算中没有使用$(( ))。 - 南山竹
@南山竹 这不是问题,索引计算在算术上下文中工作,就像这样,但赋值使用=符号周围的空格! - Benjamin W.
@BenjaminW,感谢您发现了这个问题,已经修复。 - agc

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