我有一个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
答案 0 :(得分:0)
您可以将case
和for 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