满足条件时无需增加循环

时间:2019-03-06 17:16:21

标签: bash

我有一个shell脚本,可以将地震图文件存储在一个文件夹中,并将其绘制为pdf。退出pdf时,提示用户查看该图是否质量良好。如果用户键入四个指定的提示之一,则使用case语句,以便将文件复制到相应的目录中。如果用户键入的响应不在指定列表中,则我希望代码重新绘制pdf,直到用户给出正确的响应为止。我该怎么做呢?

我已经在线阅读了需要使用while循环而不是for循环的信息,但是我不知道如何循环浏览文件夹中的文件,同时也不允许代码在某个文件上停止直到给出正确的输入。

#!/bin/bash
file=$1
designation=$2

# code to validate user input here ...

sum=0
count=0
while IFS=, read -r n d s; do 
    if [[ ${designation,,} == "${d,,}" ]]; then 
        (( sum += s ))
        (( count++ ))
    fi
done < "$file"

if (( count == 0 )); then 
    echo "No $designation found in $file"
else
    echo $((sum / count))
fi

1 个答案:

答案 0 :(得分:0)

您可以将casefor sac in $event/*R.sac; do ***preprocess the data*** while true; do read -p "Is this a good SKS event? Type 'q1' for a really good event, 'q2' for an okay event, 'ns' for a null split, or 'be' for a bad event: " -n 2 answer echo # Start by assuming answer is good answer_ok=1 case "$answer" in # (cases for valid answers omitted for clarity) * ) echo -e "\nWrong input\nTry again\n" # Flag answer as bad answer_ok=0 ;; esac # If user gave a good answer, break out of the while loop if (( answer_ok )); then break fi done done 块包装在一个while循环中,直到给出有效答案后该循环才结束:

while

终止break循环的另一种方法,也许是更干净的方法(取决于您有多少种情况)将是在每个有效的情况下,在{{1}之前添加一个;; }。这将打破while循环。但是*)情况下将没有break,因此,如果遇到这种情况,它将再次循环。

例如:

while true; do
   read -p "Is this a good SKS event? Type 'q1' for a really good event, 'q2' for an okay event, 'ns' for a null split, or 'be' for a bad event:   " -n 2  answer
   echo

   case "$answer" in
      q1) # do stuff
          break
          ;;
      q2) # do stuff
          break
          ;;
      ns) # do stuff
          break
          ;;
      be) # do stuff
          break
          ;;
      * )
          echo -e "\nWrong input\nTry again\n"
          # No break - loop back around again
          ;;          
   esac
done

另一种方法是在case循环结束之前while块之后重新检查答案:

while true; do
   read -p "Is this a good SKS event? Type 'q1' for a really good event, 'q2' for an okay event, 'ns' for a null split, or 'be' for a bad event:   " -n 2  answer
   echo

   case "$answer" in
      q1) # do stuff
          ;;
      q2) # do stuff
          ;;
      ns) # do stuff
          ;;
      be) # do stuff
          ;;
      * )
          echo -e "\nWrong input\nTry again\n"
          ;;          
   esac

   # If "$answer" is valid, break out of the loop.
   if [[ "$answer" =~ ^(q1|q2|ns|be)$ ]]; then
      break
   fi
done

=~是特定于bash的运算符,它执行正则表达式匹配。

继续这种方法,您可以将取反的正则表达式测试用作while循环的条件(在首先将answer初始化为无效答案之后,这样该条件将首先失败)时间)。

answer=foo
while [[ ! "$answer" =~ ^(q1|q2|ns|be)$ ]]; do
   read -p "Is this a good SKS event? Type 'q1' for a really good event, 'q2' for an okay event, 'ns' for a null split, or 'be' for a bad event:   " -n 2  answer
   echo

   case "$answer" in
      q1) # do stuff
          ;;
      q2) # do stuff
          ;;
      ns) # do stuff
          ;;
      be) # do stuff
          ;;
      * )
          echo -e "\nWrong input\nTry again\n"
          ;;          
   esac
done
相关问题