簡體   English   中英

如何在bash shell linux中交換數組元素?

[英]How to swap array element in 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++))

這是冒泡排序的一種實現:

#!/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[*]}"

即使在您的測試環境中,我也沒有收到 \\r 消息; 一般來說,它們是 DOS/Windows 可戰斗性的結果(帶 ab)。

由於這顯然是一個教程示例(為什么會有人進行冒泡排序),因此對代碼進行了一些說明。

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]} ,否則它將在邊界之外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM