【问题标题】:Where's the error in the given bash script used to bubblesort?用于冒泡排序的给定 bash 脚本中的错误在哪里?
【发布时间】:2017-10-12 13:31:36
【问题描述】:
array=( $(<abc.txt) )
len=${#array[*]}
i=0
while [ $i -lt "$len" ]
do
 j=0
 while [ $j -lt $(( (len - 1)) - i)) ]
 do
  k=$((j + 1))
  if [ "${array[$j]}" -gt "${array[$k]}" ]
  then
   temp=${array[$j]}
   array[$j]=${array[$k]}
   array[$k]=$temp
  fi
 j=$k
 done
i=$((i + 1))
done
echo "${array[@]}"

我的数组未排序,并且我还收到一条消息“:预期整数表达式”。它在我朋友的电脑上运行良好。我只想从另一个文件获取输入到数组,然后使用冒泡排序。如果我将数组声明为 array=( 1 2 3 4 9 8 7 6 5 ),它也可以正常工作。

【问题讨论】:

  • 有什么理由不使用sort 命令?
  • 你不需要嵌套算术表达式; $(( (len -1) - i )) 就足够了。
  • 因为作为学生我要实现冒泡排序算法
  • 首先通过 shellcheck.net 运行你的代码。
  • 任何要求您在bash 中编写排序例程的老师都忽略了shell 脚本语言的要点。如果他们教你使用不带引号的参数扩展,他们也不太了解 shell。

标签: bash bubble-sort


【解决方案1】:

你的括号在第二个 while 语句中不匹配,我改变了 len 声明。 chepner 是正确的,shellcheck.net 会为您解决这个问题。 (你甚至可以在本地安装 shellcheck。)

#!/bin/bash
#array=($(<abc.txt))
array=(1 2 3 4 9 8 7 6 5)
len=${#array[@]}
i=0
while [ $i -lt "$len" ]
do
 j=0
 while [ $j -lt "$(( ( len - 1 ) - i))" ]
 do
  k=$((j + 1))
  if [ "${array[$j]}" -gt "${array[$k]}" ]
  then
   temp=${array[$j]}
   array[$j]=${array[$k]}
   array[$k]=$temp
  fi
 j=$k
 done
i=$((i + 1))
done
echo "${array[@]}"

【讨论】:

  • 当我像您一样输入数组中的数字时,我的文件工作正常,但是当我从文件输入时出现问题。如果我没有在输入文件中的最后一位数字后放置空格,则 CR(\r) 会跟在最后一位数字后面。
  • 我已经尝试过使用 CR 和不使用 CR,它仍然有效。使用 bash 4.4.12 在 debian8 linux 上测试是否 echo -n "${array[@]}" 解决了您的问题?
  • 对我来说,CR 不允许对数组进行排序。我使用 Ubuntu 16.0.4,当我使用 set -vx 时,其中一行是 + '[' 9 -gt $'5\r' ']' : integer expression expected
  • $'5\r' 是字符串而不是整数
  • 读取文件时如何去掉回车:array=( $(tr -d '\r' &lt;abc.txt) )
猜你喜欢
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2016-01-19
  • 2012-01-17
相关资源
最近更新 更多