【问题标题】:Why this command not found when i'm comparing strings in an array?为什么在比较数组中的字符串时找不到此命令?
【发布时间】:2014-11-25 02:05:00
【问题描述】:

我的示例代码在这里

#!/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:第 22 行:[12:43:00:找不到命令

为什么它不接受这个比较,还是问题出在我的 bash 版本上?

提前感谢您的帮助。

【问题讨论】:

  • 有趣的是,阅读代码所花费的时间将少于在此处发布带有格式的问题...(尤其是因为您already know the syntax...):D
  • 是的,我已经知道这一点,但正如我所说,有时失明对我们来说是一个大问题(!!):D

标签: string bash compare


【解决方案1】:

[ 后缺少空格。 [ 是一个命令,所以它需要和它的参数分开。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 为了安全起见还要引用:if [ "${hours_array[$i+1]}" != "${hours_array[$i]}" ];这样,结束会产生错误的比较,而不是让test 抱怨语法错误。
    【解决方案3】:

    [ 前后添加空格。它是test buitin 命令的“别名”。

    您还应该在变量周围添加双引号"。因为如果它们是空的,bash 不会将它们识别为空字。

    而且我一般使用双括号[[作为测试条件,这样更安全,功能也更多。

    例子:

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

    【讨论】:

    • 很好的建议,但有些多余——使用[[ ]] 会使引号变得不必要,至少在左侧是这样。
    【解决方案4】:

    我发现这段代码中可以更改的东西很少。

    • [] 之前添加空格。
    • 添加双引号,这样如果变量为空,脚本不会抛出错误。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2013-11-13
      • 2011-06-21
      • 2012-02-09
      • 2018-10-01
      相关资源
      最近更新 更多