【问题标题】:Using variable in for Loop using seq -w option使用 seq -w 选项在 for 循环中使用变量
【发布时间】:2016-10-09 04:42:23
【问题描述】:

我正在尝试运行如下的 for 循环,但没有成功

hour=`date +%H -d "1 Hour Ago"`
cd /Log1/
for i in `seq -w 00 "$hour"`;  // $hour not working
do
zgrep -a "Packet" LOG1.txt| grep "#SUCCESS#" |wc -l >>success_chour.txt
zgrep -a "Packet" LOG2.txt| grep "#FAIL#" |wc -l >>fail_chour.txt
done

我尝试过$hour"$hour"'$hour',但均未成功。

【问题讨论】:

  • 这对我有用,但你的// 评论不会。究竟是什么不工作?你用i 做什么?
  • + cd /Log1/AL/TTT_Logs/Backup/ + echo 'Hour: 12' Hour: 12 ++ seq -w 00 12 + for i in 'seq -w 00 "$hour"' + zgrep -a'数据包[FULL' TTT.log.2016-10-09-00.gz + grep '#SUCCESS#' + wc -l + zgrep -a '数据包[FULL' TTT.log.2016-10-09-00.gz + grep '#FAIL#' + wc -l
  • cmets 中的代码非常难以阅读,因为它们的格式有限。你能edit你的问题添加相关信息吗?
  • seq 不是 bash 的一部分——没有随 bash 代码库一起提供,并且 bash 无法控制它的运行方式;它也没有被任何 POSIX 标准所涵盖。因此,我质疑这是否是一个合法的 bash 问题,而不是一个关于非常具体的操作系统实现非标准化工具的问题。
  • ...无论如何,如果您实际上没有在循环中以任何方式使用生成的值,那么在 00 和您的小时数之间进行迭代有什么意义?

标签: bash shell loops variables for-loop


【解决方案1】:

jiapingzjp@jiapingzjp-Dell:~$ cat my.sh

hour=`date +%H -d "1 Hour Ago"`
for i in `seq -w 00 "$hour"`;
do
  echo $i
done

jiapingzjp@jiapingzjp-Dell:~$ bash my.sh

00 01 02 03 04 05 06 07 08 09 10 11 12

我认为代码还可以,我在ubuntu系统中尝试了"bash test.sh""dash test.sh",它工作正常。也许你可以显示你得到的错误信息和你运行的命令。

【讨论】:

    【解决方案2】:

    不清楚在这种情况下“没有成功”是什么意思,因为您甚至没有尝试在循环体内的任何地方扩展 $i

    也就是说,使用seq 实际上并不理想——它是一个非标准的工具,没有内置在 bash 中。更好地使用保证在 shell 所在的任何地方都可用的功能:

    # Calculate both day and hour at once
    log_scan_end_time=$(date -d "1 hour ago" '+%Y-%M-%d-%H')
    
    # ...then create log_scan_prefix by removing the hour
    log_scan_prefix=${log_scan_end_time%-*}
    
    # and extract the hour alone
    max_hour=${log_scan_end_time##*-}
    
    for ((cur_hour=0; cur_hour<max_hour; cur_hour++)); do
      printf -v cur_hour_str '%02d' "$cur_hour" # generate a 0-padded string
      logs=( Packet*"${log_scan_prefix}-${cur_hour_str}"*.gz )
      [[ -e ${logs[0]} ]] || {
        echo "No logs found matching pattern ${logs[0]}" >&2
        continue
      }
    
      # print a header line in the output file to allow diagnosing results
      for f in success_chour.txt fail_chour.txt; do
        {
          printf '# '
          printf '%q ' "${logs[@]}"
          printf '\n'
        } >>"$f"
      done
    
      zgrep -E -a --count \
        -e '(Packet.*#SUCCESS#)|(#SUCCESS#.*Packet)' \
        -- /dev/null "${logs[@]}" >>success_chour.txt
      zgrep -E -a --count \
        -e '(Packet.*#FAIL#)|(#FAIL#.*Packet)' \
        -- /dev/null "${logs[@]}" >>fail_chour.txt
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多