我有两个我想要循环的数组。我正确构造它们并且在进入for循环之前,我确实回应它们以确保数组的一切正常。 但是当我运行脚本时,它会输出一个错误:
l<=: syntax error: operand expected (error token is "<="
我咨询了强大的谷歌,我明白它缺少第二个变量,但我之前提到我确实回应了价值观,一切似乎都没问题。这是片段..
#!/bin/bash
k=0
#this loop is just for being sure array is loaded
while [[ $k -le ${#hitEnd[@]} ]]
do
echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
# here outputs the values correct
k=$((k+1))
done
k=0
for ((l=${hitStart[k]};l<=${hitEnd[k]};l++)) ; do //this is error line..
let array[l]++
k=$((k+1))
done
for循环中的变量被正确回显但是循环不起作用..我在哪里错了?
#gniourf_gniourf回答:
“...在某些时候,k将达到$ {#hitEnd [@]}的值,这是 确切地说,当hitEnd [k]未定义并扩展为空字符串时! 砰!“
意味着错误输出不会显示在循环的开头,但是当k的值大于数组的索引时,指向该数组不包含的索引...
答案 0 :(得分:4)
那是因为在某些时候${hitEnd[k]}
扩展为空(未定义)。我在((l<=))
时遇到了同样的错误。您应该将for
循环编写为:
k=0
for ((l=${hitStart[0]};k<${#hitEnd[@]} && l<=${hitEnd[k]};l++)); do
以便始终拥有与数组k
中已定义字段对应的索引${hitEnd[@]}
。
此外,而不是
k=$((k+1))
你可以写
((++k))
完成!
使用更好的现代bash练习修改了您的脚本:
#!/bin/bash
k=0
#this loop is just for being sure array is loaded
while ((k<=${#hitEnd[@]})); do
echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
# here outputs the values correct
((++k))
done
k=0
for ((l=hitStart[0];k<${#hitEnd[@]} && l<=hitEnd[k];++l)); do
((++array[l]))
((++k))
done
现在,我不太确定for
循环是否完全符合您的要求......难道您的意思不是这样吗?
#!/bin/bash
# define arrays hitStart[@] and hitEnd[@]...
# define array array[@]
#this loop is just for being sure array is loaded
for ((k=0;k<${#hitEnd[@]};++k)); do
echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
# here outputs the values correct
((++k))
done
for ((k=0;k<${#hitEnd[@]};++k)); do
for ((l=hitStart[k];l<=hitEnd[k];++l)); do
((++array[l]))
done
done
答案 1 :(得分:1)
有点bandaid-y,但你将for循环重写为while循环:
l="${hitStart[k]}"
while [[ "$l" -le "${hitEnd[k]}" ]]; do
let array[l]++
k=$((k+1))
l=$((l+1))
done