![while 循环出错](https://linux22.com/image/130398/while%20%E5%BE%AA%E7%8E%AF%E5%87%BA%E9%94%99.png)
我用 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
代码中有两个错误:
用于
[ ... ]
测试时,将多个测试分开,[ ... ]
中间使用逻辑运算符:while [ expression ] && [ expression ]; do
bash
如果您正在使用和 它,您可以使用构建测试的方式[[ ... ]]
:while [[ expression && expression ]]; do
...但如果将其拆分为,它可能仍然更具可读性
while [[ expression ]] && [[ expression ]]; do
至少对于更长或更多的表达。对于仅算术测试,您可以使用
(( ... ))
inbash
和其他支持它的 shell,例如(( arithmetic expression )) && (( arithmetic expression ))
.在中,(( ... ))
您还应该使用<
等>
代替等-lt
。-gt
假设您使用
bash
数组,则在算术上下文中计算数组的索引。这意味着${a[$d]}
可以这样写${a[d]}
。更重要的是,${a[$(d-1)]}
这可能是一个错误,因为它会尝试运行名为 的命令d-1
。大概应该是这样${a[d - 1]}
。