while 循环出错

while 循环出错

我用 unix shell 脚本编写了一个程序来对整数数组进行排序。但我在第 11 行中遇到错误,该行是,

while [ $d -gt 0 && ${a[$(d-1)]} -gt ${a[$d]} ]

错误就像insertionsort.sh: line 11: [: missing]'`。我做错了什么?

答案1

您需要拆分该test命令(如果您使用的是 POSIX 兼容 shell,则引用您的扩展):

[ "$d" -gt 0 ] && [ "${a[d-1]}" -gt "${a[d]}" ]

答案2

由于这是 ksh 语法(也受bash和支持zsh -o ksharrays),因为这些数组的索引从 0 开始(而不是在所有其他 shell 中从 1 开始),因此您不妨ksh ((...))在此处使用算术求值运算符:

while ((d > 0 && a[d-1] > a[d]))

(其他人已经解释了您代码中的问题)。

请注意,zsh 内置支持对十进制整数数组进行数字排序:

$ a=(10 6 2)
$ echo ${(n)a}
2 6 10

ksh 可以对数组进行排序,但只能按词法排序:

$ a=(10 2 6)
$ set -sA b -- "${a[@]}"
$ echo "${b[@]}"
10 2 6

答案3

代码中有两个错误:

  1. 用于[ ... ]测试时,将多个测试分开,[ ... ]中间使用逻辑运算符:

    while [ expression ] && [ expression ]; do
    

    bash如果您正在使用和 它,您可以使用构建测试的方式[[ ... ]]

    while [[ expression && expression ]]; do
    

    ...但如果将其拆分为,它可能仍然更具可读性

    while [[ expression ]] && [[ expression ]]; do
    

    至少对于更长或更多的表达。对于仅算术测试,您可以使用(( ... ))inbash和其他支持它的 shell,例如(( arithmetic expression )) && (( arithmetic expression )).在中,(( ... ))您还应该使用<>代替等-lt-gt

  2. 假设您使用bash数组,则在算术上下文中计算数组的索引。这意味着${a[$d]}可以这样写${a[d]}。更重要的是,${a[$(d-1)]}这可能是一个错误,因为它会尝试运行名为 的命令d-1。大概应该是这样${a[d - 1]}

相关内容