我想打印两个名为i
和j
of 嵌套的迭代器for loops
,只要它们不相等。错误信息:
意外标记“then”附近出现语法错误
#!/bin/bash
read n
array=()
for i in `seq 1 $n`
do
read num
array+=$num
done
count=0
count2=0
countmax=0
for i in `seq 1 $n`; do
for j in `seq 1 $n`; do
if [ $i -ne $j ]; then
echo $i $j
fi
done
done
我做错了什么?
答案1
我做错了什么?
排名不分先后,
- 您没有
#!/bin/bash
或相当于第一行。 - 您似乎没有发布失败的实际脚本。 (这里的内容在语法上是正确的。)
- 你没有用双引号引用你的变量,
"$n"
而不是$n
. - 您使用过时的反引号而不是 进行评估
$( ...)
。 - 您尚未测试您的代码https://shellcheck.net/
- 您没有缩进代码块以使其更易于阅读。
- 如果要向数组添加元素,请使用
array+=($num)
.代码中的内容是字符串连接到最后一个元素。 - 在(新的)第一个块中,您分配给元素 (0 .. n-1),但稍后使用元素 (1 .. n)。
- 在(新的)第二个块中,您正在比较索引的不等式而不是数组元素。您的意思是比较
"${array[$i]}" -ne "${array[$j]}"
(或者,对于(( ... ))
构造而言,array[i] != array[j]
)?
(我可能应该指出,其中一些是好的实践,而不是基本的编码规则。)
这是应用了我的建议的代码:
#!/bin/bash
read -p 'Number of elements: ' n
array=(0) # We don't use element zero
for i in $(seq "$n")
do
read -p 'Element: ' num
array+=($num)
done
for i in $(seq "$n")
do
for j in $(seq "$n")
do
# Compare the array elements rather than the indices
# Is this what you intended?
if (( array[i] != array[j] ))
then
echo "${array[$i]} ${array[$j]}"
fi
done
done
答案2
seq
我还会通过使用 for 循环来消除使用:
#!/bin/bash
read -p 'Number of elements: ' n
array=(0)
for (( i = 1; i <= n; i++ ))
do
read -p 'Element: ' num
array+=("$num")
done
for (( i = 1; i <= n; i++ ))
do
for (( j = 1; j <= n; j++ ))
do
(( array[i] != array[j] )) && echo "${array[i]} ${array[j]}"
done
done