使用seq -w选项

时间:2016-10-09 04:42:24

标签: bash shell loops variables for-loop

我正在尝试运行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'但未成功。

2 个答案:

答案 0 :(得分:2)

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",它运行正常。也许你可以显示你得到的错误信息以及你运行的命令。

答案 1 :(得分:0)

目前尚不清楚“没有成功”在这种情况下意味着什么,因为你甚至没有尝试在你的循环体内的任何地方展开$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