当没有提供argv时提示错误expect脚本

当没有提供argv时提示错误expect脚本

我必须运行一个 Expect 脚本来实现 ssh 登录目的,但我需要创建一个在执行命令时提供 argv 的文件。

当我运行以下脚本文件时,会创建它。

#!/usr/bin/expect

set file [lindex $argv 0]
set date [exec date "%Y-%m-%d"]

spawn sh -c "touch output-$file-$date.csv"

命令输出

[root@centseven ~]# ./demo A
spawn sh -c touch output-A-2017-September-21.csv
[root@centseven ~]# ll output-
output--2017-September-21.csv   output-A-2017-September-21.csv

但是使用 argv 脚本可以工作并且文件已创建,我想要的是,如果在执行脚本时未提供 argv./demo那么它应该给出错误并且 argv 应该是 A 或 B 除此之外什么都没有。

这可能吗。

答案1

在顶部的某个地方添加类似的东西

if {[llength $argv] == 0} {
  puts stderr "Usage: $argv0 file"
  exit 1
}

llength(n)有关列表长度过程的详细信息,请参阅 参考资料。因为仅AB作为单个参数(一个非常奇怪的限制)if接受expr(n)表达式,所以

if {[llength $argv] != 1} {
  puts stderr "Usage: $argv0 (A|B)"
  exit 1
}
set firstarg [lindex $argv 0]
if {!($firstarg eq "A" || $firstarg eq "B")} {
  puts stderr "Usage: $argv0 (A|B)"
  exit 1
}

答案2

您不需要调用date:expect 实际上有 2 个内置命令:

  1. clock来自 Tcl 的命令

    set date [clock format [clock seconds] -format "%d-%B-%Y"]
    
  2. 或期望timestamp命令

    set date [timestamp -format "%d-%B-%Y"]
    

我强烈鼓励您使用不同的日期格式:%Y-%m-%d——这是 ISO8601 标准。这是明确的。而且按词汇和时间顺序排序是相同的。

相关内容