在expect脚本中执行shell命令时无法读取这样的变量

时间:2014-12-26 11:05:35

标签: linux shell expect

我有以下代码。目标是

  1. 获取与某些起始字符匹配的最新文件
  2. 来scp该文件
  3. #!/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)
    

1 个答案:

答案 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