Arrays 在bash中对从输入文件读入的数字进行排序
我有下面的bash脚本,它应该读取一个包含n个整数的.txt文件,将其添加到数组中,使用选择排序对数组进行排序,然后打印数组: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++))
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