如何在bash shell linux中交换数组元素

时间:2017-12-10 13:21:31

标签: arrays linux bash shell

我是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++)) 

2 个答案:

答案 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]},否则会超出边界。