bash从参数中填充整数数组并对其进行排序

时间:2014-10-15 19:19:20

标签: arrays bash sorting

我看了所有人,但我仍然坚持使用此代码。

例如: 用户呼叫./array.sh 3 5 6 2 1 我应该排序(我认为冒泡排序)并打印排序的数组。

    #! /bin/bash
    tab=( $@ )
    define -i temp
    for ((i = ${#tab[*]-1 ; i >= 0 ; i--)) ; do
        for ((j = 0 ; i - 1; j++)) ; do
        if [ ${tab[$i]} > ${tab[$i+1]} ] then
            $temp = ${tab[$i+1]
            ${tab[$i+1]} = ${tab[$i]}
            ${$tab[$i]} = $temp 
        fi
    done
    echo ${tab[*]} #print the array

但是bash对此不满意,他一直告诉我,我不能像这样的价值。 我做错了什么?你能帮我吗 ?我看了很多地方,但没有办法找到解决方案。

先谢谢你们。

3 个答案:

答案 0 :(得分:2)

你的变量赋值语法都错了。

首先,您不要在分配变量之前放置$

其次,=周围不能有空格。

所以它应该是:

temp=${tab[$i+1]}
tab[$i+1]=${tab[$i]}
tab[$i]=$temp

答案 1 :(得分:2)

您无法为值指定值(例如${tab[$i+1]} = ${tab[$i]});您必须分配名称或数组元素。此外,除了在数字上下文中,bash赋值中的等号(=)两侧可能没有空格。

你放弃了一些关闭的支撑。

你拼错了“宣告”。

您需要在if条件与then之间使用分号或换行符。

你并没有终止内循环。

您通过${tab[$i+1]}引用了一个不存在的数组元素。

你的内部循环有一个常量作为终止条件。

${#tab[*]-1}错误地尝试在分隔变量引用的大括号内进行数学运算。

你在内循环中引用了错误的索引变量(一致)。

>是一个重定向运算符,不大于数字上下文。

一旦你清除了大量的错误,你最终会得到

#! /bin/bash
tab=( $@ )
declare -i temp
for ((i = ${#tab[*]} - 1; i > 0 ; i--)) ; do
  for ((j = 0 ; $j < $i; j++)) ; do
    if [ ${tab[$j]} -gt ${tab[$j+1]} ]; then
      temp=${tab[$j+1]}
      tab[$j+1]=${tab[$j]}
      tab[$j]=$temp 
    fi
  done
done
echo ${tab[*]} #print the array

实际上有效。

答案 2 :(得分:1)

我知道您正在进行课堂作业等,并且限制您如何解决问题。 对于那些不那么受限制的,这是一个使用标准unix工具的简单解决方案:

#!/bin/bash
( IFS=$'\n'; echo "$*" ) | sort -n

样本用法:

$ script.sh 3 5 6 2 1
1
2
3
5
6

说明:

  • ( IFS=$'\n'; echo "$*" )

    这会导致打印命令行参数,每行一个。这是在子shell中,因此对IFS的分配不会影响脚本的其余部分。

  • sort -n

    -n告诉sort应用数字排序。