如何在bash中突破这个循环

时间:2017-11-10 18:31:47

标签: bash

当grep与其模式不匹配时,我想要摆脱这个循环。 "更高"这里的目标是:

  • 查看输出(stdout不受影响)
  • grep it for a pattern
  • 一旦找不到模式就停止处理

#!/bin/bash
set -ex
i=1
RERUN=0
while [ ${RERUN} == 0 ]
do
   ((i++))
   echo -n "Rerun${i}"| tee >(grep --color=always 'Rerun[123]' ; export RERUN=$?)
   echo ${RERUN}
   sleep 1
done

我猜它为什么不起作用就是与不同的shell级别有关

2 个答案:

答案 0 :(得分:1)

我可能这样写:

#!/bin/bash

generate_output() {
  local i=0
  while :; do
    (( ++i ))
    printf 'Rerun%s\n' "$i"
    sleep 1
  done
}

while IFS= read -r line; do
  printf '%s\n' "$line"
  [[ $line = Rerun[123] ]] || break
done < <(generate_output)

请注意,不需要使用共享变量在两个进程之间进行通信 - 通过关闭它写入的文件描述符将SIGPIPE发送到generate_output

答案 1 :(得分:0)

我找到了解决方案:

#!/bin/bash
# set -x
i=0
RERUN_FILE=$(mktemp)
declare -a TESTDATA=("run" "run" "run" "last" "run" "run" "run" )
while ! $(grep -q 1 ${RERUN_FILE})
do
   echo -n ${TESTDATA[$i]}| tee >(grep --color=always 'run'; echo -n $? >${RERUN_FILE})
   ((i++))
   sleep 1
done
rm ${RERUN_FILE} # do your dishes after the meal