为什么在比较数组中的字符串时找不到此命令?

时间:2014-09-30 12:30:55

标签: string bash compare

我的示例代码在这里

#!/bin/bash
file="output2.txt"
numbers="$(cut -d',' -f2 output2.txt)"
lines="$(cut -f2 output2.txt)"
hours="$(cut -d',' -f1 output2.txt)"
array_numbers=( $numbers )
lines_array=( $lines )
hours_array=( $hours )
difference=$1
let range=$1-1000
for (( i = 0 ; i < ${#array_numbers[@]} ; i++ )) 
do
let num=$(( 10#${array_numbers[$i+1]} - 10#${array_numbers[$i]} ))
   if [ $num -gt $1 ]
     then
       echo ${lines_array[$i+1]} "and" ${lines_array[$i]} "has a difference more than $1"
   elif [ $num -ge 0 ] && [ $num -lt $range ] 
     then
       echo ${lines_array[$i+1]} "and" ${lines_array[$i]} "has a difference more than $1"
   elif [ $num -le $1 ]
     then
       if [${hours_array[$i+1]} != ${hours_array[$i]}]
       then
         echo ${lines_array[$i+1]} "and" ${lines_array[$i]} "has a difference more than one second"
       fi
  fi
done

我再次使用相同的output2.txt:

12:43:40,317
12:43:40,318
12:43:40,332
12:43:40,333
12:43:40,334
12:43:40,335
12:43:40,336
12:43:40,337
12:43:40,338
12:43:40,339
12:43:40,353
12:43:40,354
12:43:40,356
12:43:40,358
12:43:40,360
12:43:40,361
12:43:40,362
12:43:40,363
12:43:40,364
12:43:40,365
12:43:40,382
12:43:40,384
12:43:40,385
12:43:40,387
12:43:40,388
12:43:40,389
12:43:40,390
12:43:40,391
12:43:40,404
12:43:40,405
12:43:40,406
12:43:40,407
12:43:40,408
12:43:40,409
12:43:40,410
12:43:40,412
12:43:40,413
12:43:40,414
12:43:40,415
12:43:40,428
12:43:40,429
12:43:40,431
12:43:40,432
12:43:40,433
12:43:40,434
12:43:40,435
12:43:40,436
12:43:40,437
12:43:40,438
12:43:40,440
12:43:40,443
12:43:40,458
12:43:40,459
12:43:40,460
12:43:40,461
12:43:40,462
12:43:40,463
12:43:40,464
12:43:40,465
12:43:40,466
12:43:40,479
12:43:40,480
12:43:40,481
12:43:40,482
12:43:40,483
12:43:40,484
12:43:40,485
12:43:40,486
12:43:40,487
12:43:40,501
12:43:40,503
12:43:40,504
12:43:40,505
12:43:40,506
12:43:40,509
12:43:40,510
12:43:40,511
12:43:40,512
12:43:40,513
12:43:40,514
12:43:40,515
12:43:40,517
12:44:40,518

我想要做的是将差值作为参数,如果存在超过100毫秒的值差,那么我想打印输出。部分

for (( i = 0 ; i < ${#array_numbers[@]} ; i++ )) 
    do
    let num=$(( 10#${array_numbers[$i+1]} - 10#${array_numbers[$i]} ))
          if [ $num -gt $1 ]
              then
               echo ${lines_array[$i+1]} "and" ${lines_array[$i]} "has a difference more than $1"
          elif [ $num -ge 0 ] && [ $num -lt $range ] 
              then
               echo ${lines_array[$i+1]} "and" ${lines_array[$i]} "has a difference more than $1"

实际上运作良好,但我意识到如果输入像上一部分一样有这样的列

12:43:40,517
12:44:40,518

它不会打印任何东西,所以我把最后一个elif语句放到我的代码中,但即使它打印hours_array好,但是当我比较它时它不起作用。输出总是:

  

script.sh:line 22:[12:43:00:找不到命令

为什么不接受这种比较或问题是关于我的bash版本?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

[之前和之后添加空格。这是一个别名&#39;到test buitin命令。

您还应该在变量周围添加双引号"。因为如果它们是空的,那么bash不会认为它们是空话。

我通常使用双括号[[来测试条件,它更安全,功能更多。

示例:

if [[ "${hours_array[$i+1]}" != "${hours_array[$i]}" ]]

答案 1 :(得分:0)

[后缺少空格。 [是一个命令,因此需要将其与参数分开。

if [ ${hours_array[$i+1]} != ${hours_array[$i]} ]

答案 2 :(得分:0)

这里需要一个空格([是一个命令)

 if [ ${hours_array[$i+1]} != ${hours_array[$i]} ]

答案 3 :(得分:0)

我发现在此代码中可以更改的内容很少。

  • [之后和]之前添加空格。
  • 添加双引号,以便在变量为空的情况下,脚本不会抛出错误。

    if [ "${hours_array[$i+1]}" != "${hours_array[$i]}" ]
    
  • 当您到达最后一行时,$i + 1将失败。因此,以下会更好。

    for (( i = 0 ; i < ${#array_numbers[@]} - 1 ; i++ ))