Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在bash中对从输入文件读入的数字进行排序_Arrays_Bash_Shell_Sorting - Fatal编程技术网

Arrays 在bash中对从输入文件读入的数字进行排序

Arrays 在bash中对从输入文件读入的数字进行排序,arrays,bash,shell,sorting,Arrays,Bash,Shell,Sorting,我有下面的bash脚本,它应该读取一个包含n个整数的.txt文件,将其添加到数组中,使用选择排序对数组进行排序,然后打印数组: a=() filename="$1" while IFS='' read -r line || [[ -n "$line" ]]; do a+=($line) done < "$filename" for((i=0; i<${#a[@]}; i++)) do min=$i for((j=$i+1; j<${#a[@]}; j++))

我有下面的bash脚本,它应该读取一个包含n个整数的.txt文件,将其添加到数组中,使用选择排序对数组进行排序,然后打印数组:

a=()
filename="$1"
while IFS='' read -r line || [[ -n "$line" ]]; do
    a+=($line)
done < "$filename"

for((i=0; i<${#a[@]}; i++))
do
  min=$i
  for((j=$i+1; j<${#a[@]}; j++))
  do
    if (( ${a[$j]} <= ${a[$min]} ))
    then
      $min=$j
      echo "$min"
    fi
  done
  temp=a[$i]
  a[$i]=a[$min]
  a[$min]=$temp
done

for i in ${a[@]}
do
  echo $i
done
感谢您的帮助! 注意:我知道排序数组的方法更简单,我正在使用此脚本实现选择排序。

如果您使用的是bash,您可以利用其内置函数,如
sort
readarray
。(请注意,
readarray
自bash 4+以来一直可用,默认情况下不支持OS X。)

您可以删除排序代码,并按说明使用以下代码


readarray-t排序<
$min=$j
肯定是一个错误。它应该是
min=$j
。您访问阵列单元的方式(
temp=a[$i]
a[$i]=a[$min]
)也是如此。使用
temp=${a[$i]}
a[$i]=${a[$min]}
。但还有一些事情你可以改进:

declare -ai a=()
declare -i i j min temp
declare line

filename="$1"
while IFS='' read -r line; do
  [[ $line =~ ^[0-9]+$ ]] && a+=($line) || printf "Warning: not a number (%s)\n" "$line"
done < "$filename"

for (( i=0; i<${#a[@]}; i++ ))
do
  min=$i
  for (( j=i+1; j<${#a[@]}; j++ ))
  do
    if (( a[j] <= a[min] ))
    then
      min=$j
      echo "$min"
    fi
  done
  temp=${a[i]}
  a[i]=${a[min]}
  a[min]=$temp
done

for i in "${a[@]}"
do
  echo "$i"
done
declare-ai a=()
声明-i最小温度
声明行
filename=“$1”
而IFS=''read-r行;做
[[$line=~^[0-9]+$]&&a+=($line)| | printf“警告:不是数字(%s)\n”“$line”
完成<“$filename”

为了((i=0;此脚本的目的只是使用shell实现选择排序算法。我知道这可以用一种更简单的方法完成,我唯一的问题是当前脚本的问题是什么。我运行了它,它成功了,我可能认为唯一的问题是
$min=$j
应该是
min=$j
为什么不把$?i init以前对它进行了序列化。在我的bash版本中,由于
/test.sh:line 15:2=3:command not found
,它失败了。在for循环的初始化过程中,我给int赋值了一个int?这里似乎没有问题。bash中的选择排序?您希望人们如何回答您的问题?这只是一个实现,排序本身并不是问题;它是这是从文件中读取的,我相信是有条件的。谢谢!我仍然不明白为什么它不是$min=$j。我在这一行之前声明了min,当访问已经初始化的变量时,你不总是需要放一个$吗?
min
是变量名。
$min
是它的值。我们不需要改变它的值吗用$min而不是min?F.e.a=5,b=1,$a=2,$a=$b是我们根据我所学改变变量值的方式。如果
min
的值是5,你执行
$min=6
扩展将其转换为
5=6
,你会得到一条错误消息,因为它没有意义。把
$x
看作
值(x)
x
作为变量的名称。哦!所以$类似于C中取消引用指针的概念,至少我是这样理解的。谢谢!
readarray -t sorted < <(for b in "${a[@]}"; do echo "$b"; done | sort)
declare -ai a=()
declare -i i j min temp
declare line

filename="$1"
while IFS='' read -r line; do
  [[ $line =~ ^[0-9]+$ ]] && a+=($line) || printf "Warning: not a number (%s)\n" "$line"
done < "$filename"

for (( i=0; i<${#a[@]}; i++ ))
do
  min=$i
  for (( j=i+1; j<${#a[@]}; j++ ))
  do
    if (( a[j] <= a[min] ))
    then
      min=$j
      echo "$min"
    fi
  done
  temp=${a[i]}
  a[i]=${a[min]}
  a[min]=$temp
done

for i in "${a[@]}"
do
  echo "$i"
done