Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Bash 应为操作数-Shell While循环_Bash_Shell_Sorting_While Loop - Fatal编程技术网

Bash 应为操作数-Shell While循环

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

大家好,我正在尝试在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 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