![argv가 제공되지 않으면 스크립트 오류가 발생합니다.](https://linux55.com/image/118361/argv%EA%B0%80%20%EC%A0%9C%EA%B3%B5%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9C%BC%EB%A9%B4%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EB%8B%A4..png)
SSH 로그인을 위해 Expect 스크립트를 실행해야 하는데, 명령 실행 시 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
or 는 표현식을 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
. 실제로 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 표준입니다. 이것은 분명합니다. 그리고 어휘 순서와 연대순 순서는 동일합니다.