我有以下代码。目标是
#!/usr/bin/bash
#!/usr/bin/expect -f
ztools=$(ls -t|find -name '/home/user/releases/ztools*.tar.gz'|head -n1)
ztools=$(echo $ztools | cut -c 3-)
# connect via scp and transfer ztools
spawn scp /home/user/releases/${ztools} user@xx.xx.xx.xx:/home/user
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "Password\r"
}
}
interact
但是当我运行这个时,我得到以下错误 任何人都可以帮助我
can't read "(ls -t|find -name '/home/zadmin/releases/ztools*.tar.gz'|head -n1)": no such variable
while executing
"ztools=$(ls -t|find -name '/home/zadmin/releases/ztools*.tar.gz'|head -n1)"
(file "copy_ztools_cust.sh" line 2)
答案 0 :(得分:2)
您似乎在那里合并了两个脚本。一个shell脚本和一个期望脚本。
这一行是shell脚本的shebang行
#!/usr/bin/bash
此行是期望脚本的shebang行
#!/usr/bin/expect -f
这些行是shell代码
ztools=$(ls -t|find -name '/home/user/releases/ztools*.tar.gz'|head -n1)
ztools=$(echo $ztools | cut -c 3-)
这些行是expect / tcl代码
# connect via scp and transfer ztools
spawn scp /home/user/releases/${ztools} user@xx.xx.xx.xx:/home/user
#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send "Password\r"
}
}
interact
如果您希望这些行正常工作,则需要将这些行拆分回单独的代码中。
此外,那些贝壳线根本没有做你想要的,也不是正确的方法。
我不相信管道的ls -t
位正在为你做任何事情,因为我根本不相信从标准输入读取数据。
ztools*.tar.gz
文件名是否以对您有用的方式排序,还是需要修改文件的时间?
如果文件名按字母顺序排序,则可能是
ztools=(/home/zadmin/releases/ztools*.tar.gz)
ztools=${ztools[0]}
如果文件名不按字母顺序排序(但可以使用sort
排序),那么您可能需要
ztools=$(printf '%s\0' /home/zadmin/releases/ztools*.tar.gz | sort -z)
ztools=${ztools[0]}
如果无法使用sort
对文件名进行排序,并且确实需要修改时间,那么如果您的文件名保证不包含任何空格/换行符/ glob元字符/等。然后你可以使用(但请注意,面对文件名,这根本不是安全的)
ztools=$(ls -t | head -n1)
如果你不能确定你将要处理的文件名(通常你不应该赌它,即使你相信你可以)并且修改时间仍然是必要的,那么你被迫使用更像是this answer