直到bash脚本的循环

时间:2015-05-13 15:25:25

标签: bash for-loop scripting infinite-loop

我想以下列方式使用Until循环命令,使用until循环,以便在条件为假时脚本不应该结束

#!/bin/bash
read -p " enter the App name : " app
file="/logs/$app/$app.log"
if ! [ -f "$file" ]; then
    echo "$app.log not found, Please check correct log name in deployer"
    exit
fi

format=$(head -1 $file | awk '{print $1,$2,$3}')
format1=$(tail -1 $file | awk '{print $1,$2,$3}')
read -p " Enter the Date in this Format --'$format' : " first
until grep -q "$first" "$file"
do
  echo "Date not found"
  read -p " Enter the Date in this Format --'$format' : " first
done
final_first=$first
echo "logs are present till this '$format1' date, use this date if you want logs from Provided to latest."
read -p "Enter the end date : " end
until grep -q "$end" "$file"
do
  echo "Date not found"
  read -p "Enter the end date : " end
done
final_end=$end
cd /logs/$app
sed -n " /$final_first/,/$final_end/ "p $file >$app.txt
zip $app.zip $app.txt
rm $app.txt

但我得到了这个输入

$ ./test
 enter the App name : cspt
 Enter the Date in this Format --'Sep 08 04:53:30' : er
logs are present till this 'at java.lang.Thread.run(Thread.java:662) ' date, use this date if you want logs from Provided to latest.
Enter the end date : Sep 08 04:53:30
  adding: cspt.txt (deflated 99%)

这里没有结束日期..并生成日志文件

1 个答案:

答案 0 :(得分:1)

  

但我得到了这个输入

$ ./test
 enter the App name : cspt
 Enter the Date in this Format --'Sep 08 04:53:30' : er
logs are present till this 'at java.lang.Thread.run(Thread.java:662) ' date, use this date if you want logs from Provided to latest.
Enter the end date : Sep 08 04:53:30
  adding: cspt.txt (deflated 99%)
  

这里没有结束日期..并生成日志文件

相反,看起来它确实提示并读取结束日期(在示例中以Sep 08 04:53:30给出)。您是否可以表示您希望脚本拒绝er作为开始日期?

也许剧本可能会更具辨别力,但我认为没有理由认为它与你告诉它的行为有什么不同。您接受作为开始“日期”出现在文件中任何位置的任何字符串,或多或少。认为字符串“er”会出现在冗长的日志文件中是不合理的。

但是,请注意,如果给定的“日期”中的任何一个包含正则表达式元字符,则脚本可能会出现意外行为。这些日期可能与您不期望的地方相匹配。

此外,包含斜杠(/)字符的日期将导致sed命令出现问题。