我看了所有人,但我仍然坚持使用此代码。
例如: 用户呼叫./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对此不满意,他一直告诉我,我不能像这样的价值。 我做错了什么?你能帮我吗 ?我看了很多地方,但没有办法找到解决方案。
先谢谢你们。
答案 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
应用数字排序。