使用case语句进行决策时,bash脚本不起作用

埃迪·里德(Eddie Reed)

我有以下脚本,该脚本将基于文件“ schedule.csv”的输入来安排作业。该文件包含7个字段,而$ f7字段包含一个标志,该标志对于需要调度的作业具有“ NOT_S”,如果已经调度了该作业,则具有“ YES”。

#!/bin/bash
filename='/home/opc/3A-Lab/schedule.csv'

i=1
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7; do

        case "$f7" in

        NOT_S)
                test  $i -eq 1 && ((i=i+1)) && continue
                echo "/home/opc/3A-Lab/3ALab.sh $f5 start" | at  now
                echo "/home/opc/3A-Lab/3ALab.sh $f5 stop"  | at  now + "$f6" " " "hours"
                ;;
        YES)
                echo "Already Scheduled"
                ;;
esac
done < $filename

echo "something is wrong"

当我运行脚本时,得到的输出是“出问题了”,这是我添加了一个故障排除步骤来提醒我,由于某种原因,我的逻辑无法正常工作。

我想要的是具有标志“ NOT_S”的作业,那些具有“ YES”的作业将被忽略。没有决策逻辑,作业将按需要进行调度。但是,这样做的问题是,一旦脚本再次运行,我便无法排除已经安排好的作业。它正在读取的文件是由Google表单生成的,我正在通过wget从Google表格下载响应。我目前在Google Sheets中的$ f7列中设置了标志,以便在一段时间后,再次下载文件并在服务器上再次运行脚本时,它将仅处理已添加到工作表中的作业。具有“ NOT_S”标志,而忽略其他标志。

我为什么在脚本中做错了什么,为什么它没有选择$ f7的值并执行命令来调度作业?感谢您的任何帮助,您可以提供。

编辑:

这是schedule.csv文件外观的示例

Timestamp,Email Address,First Name,Last Name,Workstation Name,Duration (in hours),Schedule Flag
,,,,no workstation,,YES
1/1/2021 14:52:11,[email protected],Jone Doe,no workstation,2,NOT_S
1/1/2021 15:39:48,[email protected],jane,sue,no workstation,2,NOT_S
1/1/2021 15:40:26,fred.flintstone,Fred,Flintsone,no workstation,5,YES
,,,,no workstation,,YES
,,,,no workstation,,
,,,,no workstation,,

因此,让我解释一下该文件:一个学生来到Google表单来预订虚拟工作站的时间。该表格会自动检索其电子邮件地址。根据他们的电子邮件地址,工作表中将填充与该学生相关的工作站名称。然后表格询问他们要在工作站上保留多少时间。他们可以从下拉菜单中选择1到5个小时。完成后,该表单会将其条目保存到Google工作表中。

该工作表具有一个公式,该公式将确定使用时间戳记时间+10分钟将字段7中的标志设置为NOT_S或YES。10分钟结束后,该标志将设置为YES。在调度时,将其设置为NOT_S。

以下是在没有条件逻辑的情况下调度作业的脚本的示例输出:

job 13984 at Sat Jan  2 14:41:00 2021
syntax error. Last token seen: hours
Garbled time
job 13985 at Sat Jan  2 14:41:00 2021
job 13986 at Sat Jan  2 16:41:00 2021
job 13987 at Sat Jan  2 14:41:00 2021
job 13988 at Sat Jan  2 16:41:00 2021
job 13989 at Sat Jan  2 14:41:00 2021
job 13990 at Sat Jan  2 19:41:00 2021
job 13991 at Sat Jan  2 14:41:00 2021
syntax error. Last token seen: hours
Garbled time
job 13992 at Sat Jan  2 14:41:00 2021
syntax error. Last token seen: hours
Garbled time
[opc@vm-control-server 3A-Lab]$ 

第二次编辑:

这是使用Gordon建议的命令的输出:

[opc@vm-control-server 3A-Lab]$ file ./schedule.csv 
./schedule.csv: ASCII text, with CRLF line terminators
[opc@vm-control-server 3A-Lab]$ LC_ALL=C cat -vet ./schedule.csv 
Timestamp,Email Address,First Name,Last Name,Workstation Name,Duration (in hours),Schedule Flag^M$
,,,,no workstation,,YES^M$
1/1/2021 14:52:11,[email protected],Philip,Monroe,no workstation,2,NOT_S^M$
1/1/2021 15:39:48,[email protected],John,Crocket,no workstation,2,NOT_S^M$
1/1/2021 15:40:26,[email protected],Eddie,Reed,no workstation,5,YES^M$
,,,,no workstation,,YES^M$
,,,,no workstation,,^M$
,,,,no workstation,,[opc@vm-control-server 3A-Lab]$ 

编辑3:

这是我正在运行脚本的更新文件:

[opc@vm-control-server 3A-Lab]$ LC_ALL=C cat -vet ./schedule.csv 
Timestamp,Email Address,First Name,Last Name,Workstation Name,Duration (in hours),Schedule Flag^M$
,,,,no workstation,,YES^M$
1/1/2021 14:52:11,[email protected],Philip,Monroe,no workstation,2,NOT_S^M$
1/1/2021 15:39:48,[email protected],John,Crocket,no workstation,2,NOT_S^M$
1/1/2021 15:40:26,[email protected],Fred,Brown,no workstation,5,YES^M$
,,,,no workstation,,YES^M$
,,,,no workstation,,^M$
,,,,no workstation,,[opc@vm-control-server 3A-Lab]$ 

脚本的输出。请记住,此运行没有任何决策逻辑,因此它没有考虑f7字段,因此它计划工作表上的所有作业。

[opc@vm-control-server 3A-Lab]$ ./final2.sh
job 13993 at Sat Jan  2 15:38:00 2021
syntax error. Last token seen: hours
Garbled time
job 13994 at Sat Jan  2 15:38:00 2021
job 13995 at Sat Jan  2 17:38:00 2021
job 13996 at Sat Jan  2 15:38:00 2021
job 13997 at Sat Jan  2 17:38:00 2021
job 13998 at Sat Jan  2 15:38:00 2021
job 13999 at Sat Jan  2 20:38:00 2021
job 14000 at Sat Jan  2 15:38:00 2021
syntax error. Last token seen: hours
Garbled time
job 14001 at Sat Jan  2 15:38:00 2021
syntax error. Last token seen: hours
Garbled time
[opc@vm-control-server 3A-Lab]$ 

编辑4:

Olivier的修改效果很好。但是,我需要解决另一个问题,希望大家都能帮助我。因此,谷歌片我是从谷歌的形式收集的响应具有式在其上,它检查请求的条目+10分钟的时间戳,看看它>=now()时间,如果是,它改变了标志为YES。很好,它在窗体上很好用,并且ther标志被更改了,但是,当我的cron作业提取文件的下一个wget时,它无法识别对f7字段的更改,并且仍然具有NOT_S条目,因此我的脚本将继续安排已经安排好的工作。

我最终想要做的是一旦计划好作业,立即将标志设置为YES,以便一旦再次读取文件,它将被忽略。

我试图弄清楚如何使用wget仅将所做的更改提取到sheets文件中,而不必每次都下载整个内容。我想设置一些东西,以便我可以写出到Linux服务器上的本地文件,而只是让脚本使用标记更改来更新该本地文件,并且仅从Google工作表中获取新条目。我希望对此有所帮助。谢谢。

奥利维尔·杜拉克(Olivier Dulac)

您的输入文件在unix换行符(lf)之前具有^ M(cr)个字符。因此,您的f7字段不是预期的。

通过以下文件传递文件:dos2unix <oldfile> newfile

或:tr -d'\ 015'<oldfile> newfile

然后再试一次。

还请确保:

  • 所有输入行都有7个参数(是否为空,即有6个逗号): awk -F',' '(NF != 7) { print "line: " NR " has " NF " arguments : " $0 }' /home/opc/3A-Lab/schedule.csv
  • 为您的案例添加一条默认行,以通知哪些行与两种情况都不对应: *) printf "Something is wrong: We have a line with an unexpected f7='%s'\n" "$f7" ;;#在esac之前。
  • 删除最后一个回声:无论何时,它都会一直显示。或只是将其修改为:echo "End of the script."
  • 并且带有小时的行有一个额外的空参数:更改at now + "$f6" " " "hours"at now + "$f6" hours

因此,脚本变为:

#!/bin/bash
filename='/home/opc/3A-Lab/schedule.csv'

i=0
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7; do
    i=$(( i + 1 ))
    if [ "$i" = "1" ]; then printf "Bypass first line\n" ; continue ; fi
    if [ -z "$f1" ]; then printf "Bypass line: %s, empty field f1\n" "$i" ; continue ; fi
    case "$f7" in
    NOT_S)
            printf "/home/opc/3A-Lab/3ALab.sh %s start\n" "$f5" | at  now
            printf "/home/opc/3A-Lab/3ALab.sh %s stop\n"  "$f5" | at  now + "$f6" hours
            printf "scheduled start and stop for line: %s\n" "$i"
            ;;
    YES)
            printf "line %s: YES : Already Scheduled\n" "%i"
            ;;
    "")     printf "Warning: I see an empty f7... for line: %s =  '%s,%s,%s,%s,%s,%s,%s'\n" "$i" "$f1" "$f2" "$f3" "$f4" "$f5" "$f6" "$f7"
            ;;
    *)
            printf "Something is wrong: line %s: we see f7='%s'\n No action taken.\n" "$i" "$f7"
            ;;
    esac
done < $filename

printf "End of the Script.\n"

对于为什么您不想对遇到的第一条NOT_S行(即,i = 1)不做任何事情,我也感到困惑。但是,您可能有自己的理由。

edit1:在任何地方都将echo更改为printf,要养成良好的习惯(printf是可移植的,echo不是。)edit2:在绕过标题和注释的注释之后更改脚本(以及$ i的原因)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试在mysqldump上使用bash脚本不起作用

来自分类Dev

定时bash脚本不起作用

来自分类Dev

简单的bash脚本不起作用

来自分类Dev

Bash脚本不起作用?

来自分类Dev

简单的bash脚本不起作用

来自分类Dev

Shell Bash 脚本不起作用

来自分类Dev

Bash 脚本不起作用

来自分类Dev

if语句在Bash脚本中不起作用

来自分类Dev

脚本不起作用

来自分类Dev

脚本不起作用

来自分类Dev

通过-c传递到bash时脚本不起作用

来自分类Dev

使用'#!/ bin / sh'运行脚本时,该脚本不起作用

来自分类Dev

为什么我的bash脚本不起作用?

来自分类Dev

具有scrot区域的Bash脚本不起作用

来自分类Dev

为什么此bash脚本不起作用?

来自分类Dev

HandbrakeCLI bash批处理脚本不起作用。

来自分类Dev

为什么此Bash脚本不起作用?

来自分类Dev

crontab中的Bash脚本不起作用

来自分类Dev

为什么我的bash脚本不起作用?

来自分类Dev

用户键入空格时,Windows脚本不起作用

来自分类Dev

单击链接时,rails jquery脚本不起作用

来自分类Dev

从公式获取值时脚本不起作用

来自分类Dev

推送到设备时,Shell 脚本不起作用

来自分类Dev

BASH-使用rm命令的简单脚本不起作用

来自分类Dev

使用WAMP服务器时PHP脚本不起作用

来自分类Dev

Python中使用子流程的脚本不起作用

来自分类Dev

使用Ajax调用PHP脚本不起作用

来自分类Dev

当我在MVC4中使用Datepicker jQuery脚本时用于调用操作的脚本不起作用

来自分类Dev

脚本不起作用,但命令在脚本之外起作用