[英]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.