我是linux的初学者。我知道这只是一个基本问题。但是我对如何交换数组中元素值的语法有疑问。
array="5 3 2 1 4"
echo "${array[*]}"
changed=1
while [ $changed != 0 ]
do
changed=0
for (( i=0 ; i<=${#array[@]}-1 ; i++ ))
do
if [ ${array[$i]} -gt ${array[$i+1]} ]
then
tmp=${array[$i]}
array[$i]=${array[$i+1]}
array[$i+1]=$tmp
changed=1
fi
done
done
echo "Sorted array: "
echo "${array[*]}"
- 编辑 嗨,大家好,谢谢你回答我的问题。我现在更改了代码,它看起来像这样。
但不幸的是仍然存在问题。 :(
它说。
jdoodle.sh: line 3: $'\r': command not found
jdoodle.sh: line 8: syntax error near unexpected token `$'\r''
jdoodle.sh: line 8: ` for ((i=0;i<=${#array[@]}-1;i++))
答案 0 :(得分:2)
这是冒泡排序的一个实现:
#!/bin/bash
array=(5 3 2 1 4)
echo "${array[*]}"
size=${#array[@]}
for (( i=0; i<size-1; i++ )); do
for (( j=0; j<size-i-1; j++ )); do
if (( array[j] > array[j+1] )); then
tmp=${array[j]}
array[j]=${array[j+1]}
array[j+1]=$tmp
fi
done
done
echo "Sorted array:"
echo "${array[*]}"
您的代码的主要问题是它实际上不使用数组。
定义像array=(value1 value2 value3)
这样的数组。最好使用[[ ]]
代替[ ]
进行测试。如果我们稍微改变你的代码以创建一个有效的冒泡排序算法,它可能看起来像这样:
#!/bin/bash
array=(5 3 2 1 4)
echo "${array[*]}"
changed=1 j=0
while [[ $changed != 0 ]]
do
((j++))
changed=0
for (( i=0; i<${#array[@]}-j; i++ ))
do
if [[ ${array[i]} -gt ${array[i+1]} ]]
then
tmp=${array[i]}
array[i]=${array[i+1]}
array[i+1]=$tmp
changed=1
fi
done
done
echo "Sorted array:"
echo "${array[*]}"
答案 1 :(得分:0)
即使在您的测试环境中,我也没有获得\ r \ n消息;一般来说,它们是DOS / Windows可组合性的结果(带有b)。
因为这显然是一个教程示例(为什么还有人会冒泡),还有一些关于代码的评论。
array="5 3 2 1 4"
不会创建所需的数组。它创建一个字符串。你在寻找的是:
array=(5 3 2 1 4)
数组的最后一个元素是${#array[@]}-1
。元素计数从0开始。所以你的for循环应该是:
for (( i=0 ; i<=${#array[@]}-2 ; i++ ))
-2
,因为您引用的是${array[$i+1]}
,否则会超出边界。