我是期望脚本的新手,尝试在期望脚本中实现以下命令(否则有效)
$ grep -i cps config.cfg | grep -v "//cps" | grep -v "cps := 4.1" | \
grep -v "cps := 2.2" | grep -v "cps := 5.1" | grep -v "cps := 7.4"| \
awk '{ SUM += $3} END { print SUM}'
该命令汇总了配置文件中每秒的 cps 调用总数,不包含某些值(例如 4.1、2.2、5.1 和 7.4)。
由于命令很长,我正在考虑分部分声明该命令,但在执行脚本时出现语法错误:
set cpscmd1 "grep -i cps traffic.cfg"
set cpscmd2 "| grep -v "//cps" | grep -v "cps := 4.1" | grep -v "cps := 2.2"
set cpscmd3 "| grep -v "cps := 5.1" | grep -v "cps := 7.4"| \
awk '{ SUM += $3} END { print SUM}''"
...
exp_send "$cpscmd1 $cpscmd2 $cpscmd3 ";exp_send\r
您能给我一些关于如何以正确的方式执行此操作的提示吗?
答案1
您没有说明您得到的确切语法错误是什么,但看起来您主要遇到引号转义的问题。例如,cpscmd2
有了所有这些双引号,开始和结束引号应该是什么,以及哪些引号应被视为命令本身的一部分?将引号作为命令的一部分传递的方法是使用以下命令转义它们\
:
set cpscmd2 "| grep -v \"//cps\" | grep -v \"cps := 4.1\" | grep -v \"cps := 2.2\" "
(您还缺少末尾的右引号。)或者,由于您正在 grep 文本字符串,因此可以对这些字符串使用单引号,使其更具可读性:
set cpscmd2 "| grep -v '//cps' | grep -v 'cps := 4.1' | grep -v 'cps := 2.2' "
您还需要退出$
登录cpscmd3
。你的期末考试\r
也应该被引用。
但我建议让 awk 命令处理您不想计算的值,方法是从 SUM 中专门忽略它们。这最终将是:
set cpscmd1 "grep -i 'cps' traffic.cfg | grep -v '//cps' "
set cpscmd2 "| awk '\$3 !~ /4.1|2.2|5.1|7.4/ { SUM += \$3} END { print SUM}' "
...
exp_send "$cpscmd1 $cpscmd2 \r"