我必须运行一个 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)
有关列表长度过程的详细信息,请参阅 参考资料。因为仅A
或B
作为单个参数(一个非常奇怪的限制)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 个内置命令:
这
clock
来自 Tcl 的命令set date [clock format [clock seconds] -format "%d-%B-%Y"]
或期望
timestamp
命令set date [timestamp -format "%d-%B-%Y"]
我强烈鼓励您使用不同的日期格式:%Y-%m-%d
——这是 ISO8601 标准。这是明确的。而且按词汇和时间顺序排序是相同的。