Bash 应为操作数-Shell While循环
大家好,我正在尝试在shell中进行冒泡排序,但得到了一个操作数预期错误。我已经初始化了需要使用的变量,并确保使用了正确的语法(如果没有,请更正)。我得到的错误在这一行: x=${array[$i]} 多谢各位Bash 应为操作数-Shell While循环,bash,shell,sorting,while-loop,Bash,Shell,Sorting,While Loop,大家好,我正在尝试在shell中进行冒泡排序,但得到了一个操作数预期错误。我已经初始化了需要使用的变量,并确保使用了正确的语法(如果没有,请更正)。我得到的错误在这一行: x=${array[$i]} 多谢各位 #!/bin/bash array=( "$@" ) #echo ${array[@]} print all elements in the array if [ $# -gt 9 ] then echo Too many arguments, run the program
#!/bin/bash
array=( "$@" )
#echo ${array[@]} print all elements in the array
if [ $# -gt 9 ]
then
echo Too many arguments, run the program over again
exit
fi
echo $array
i=0
j=0
#for j in { $j -lt ${#array[@]-1} } #((j = 0; j < $@ - 1}; j++))
while [ $j -lt ${#array[@]-1} ]
do
for i in {$array}
#for((i=0; i< array; i++))
do
x=${array[$i]}
y=${array[$i]+1}
if [ $x -gt $y ]
temp=${array[$i]}
${array[$i]}=${array[$i+1]}
${array[$i+1]}=$temp
fi
done
done
echo "Sorted Array: " ${array[@]}
#if ((array[i] > array[i+1]))
#if((x>y))
#if [ ${array[$i]} -gt ${array[$i]+1} ]
#/bin/bash
数组=(“$@”)
#echo${array[@]}打印数组中的所有元素
如果[$#-gt 9]
然后
回显太多参数,请重新运行程序
出口
fi
echo$阵列
i=0
j=0
#对于{$j-lt${#数组[@]-1}}}中的j(j=0;j<$@-1};j++)
而[$j-lt${#数组[@]-1}]
做
对于{$array}中的i
#对于((i=0;i数组[i+1]))
#如果((x>y))
#如果[${array[$i]}-gt${array[$i]+1}]
for i in{$array}
按数组元素循环,因此$i
是字符串,而不是索引。要按所需索引循环,请执行以下操作:
for ((i=0; i<${#array[*]}; i++));
do
x=${array[i]}
y=${array[i+1]}
if [ $x -gt $y ]
temp=${array[i]}
${array[i]}=${array[i+1]}
${array[i+1]}=$temp
fi
done
for((i=0;i在这个脚本中有很多地方,你已经把语法去掉了,刚好可以做一些与你想要的完全不同的事情。为了演示这些问题,让我初始化几个变量:
$ array=(15 22 30 93 27)
$ i=2
好的,第一个有问题的命令是echo$array
。这只打印数组的第一个元素;要打印其所有元素,请使用echo“${array[@]}”
。请注意,我在其周围加了双引号——在变量引用周围加双引号几乎总是一个好主意,以避免分词和通配符扩展带来意外影响。当我说“好主意”时,我的意思是“如果不这样做,当您测试它时,它可能会工作得非常好,然后某个时候会出现一个奇怪的错误,您将不知道发生了什么,直到您跟踪到一个应该被双引号引用的变量引用“。双引号变量引用是很好的脚本编写方法。无论如何,这里有一个不正确数组打印的快速演示:
$ echo $array # wrong
15
$ echo "${array[@]}" # right
15 22 30 93 27
其次,在中,[$j-lt${#数组[@]-1}]
,即“-1”位于bash不进行数学运算的位置。通常,在${}
中,-某物
意味着如果未定义变量,则应使用“-”之后的内容。在这里,它基本上被忽略:
$ echo "${#array[@]-1}" # wrong
5
$ echo "${#array[@]}" # equivalent, still wrong
5
为了做数学,你需要进入一个数学环境。你可以用$(())
:
…但在这种情况下,使用算术测试表达式(())
比使用[]]
的普通测试更简单。请注意,[]
和(())
之间的比较运算符不同,并且不必使用$
来获取变量的值;结果如下:
while (( j < ${#array[@]} - 1 )) # right
实际上,还有另一种方法;您可以使用${!array[@]}
获取数组的索引列表(“!”使其提供索引,而不是内容):
下一个问题:在{$array}
中,它只获取数组的第一个元素,并在其周围放置一个“{}”:
$ echo "{$array}" # wrong
{15}
这基本上是做与外部相同的事情,而
/用于
循环,所以这些解决方案中的任何一个都可以在这里工作
接下来,y=${array[$i]+1}
——同样,这不是一个算术上下文,因此+
根本不会做您期望的事情。在${}
中,+something
意味着“如果定义了变量,则使用值'something'。因为array
已经定义,所以总是将y
设置为“1”。要解决此问题,只需将+1
放在[]
内(这是一个算术上下文,因此数学是有效的)。此外,您还可以在i
上省去$
,因为它是一个算术上下文,变量引用是自动的:
$ echo "${array[$i]+1}" # wrong
1
$ echo "${array[i+1]}" # right
93
接下来,为了比较if[$x-gt$y]
,if
需要一个then
(在下一行或用分号分隔的同一行:
if [ $x -gt $y ]; then # right
if [ $x -gt $y ]
then # also right
顺便说一句,如果((array[i]>array[i+1])在接近结尾的注释中,您可以使用if((array[i]>array[i+1])
来获取和比较数组元素。如果您使用,则可以使用
好的,最后一个问题:在${array[$i]}=${array[$i+1]}
,您告诉bash获取数组的i
第个元素中的值,并将该名称的变量设置为下一个元素的值。嗯,有点,它实际上甚至比这更奇怪。无论如何,问题是当分配给数组元素时,您没有将其包装在${}
中:
$ ${array[$i]}=${array[$i+1]} # wrong
-bash: 30=93: command not found
$ array[$i]=${array[$i+1]} # right
$ array[i]=${array[i+1]} # also right
对于{$array}
中的i只在一个元素上循环,数组[0]
在括号内{…}
:)如果您希望人们查看您的代码,缩进将是一个很好的第一步。
$ echo "${array[$i]+1}" # wrong
1
$ echo "${array[i+1]}" # right
93
if [ $x -gt $y ]; then # right
if [ $x -gt $y ]
then # also right
$ ${array[$i]}=${array[$i+1]} # wrong
-bash: 30=93: command not found
$ array[$i]=${array[$i+1]} # right
$ array[i]=${array[i+1]} # also right