无法通过SFTP get命令返回多变量字符串

时间:2019-04-12 13:21:50

标签: shell concatenation ksh

我正在研究一个ksh脚本,它每小时通过sftp检索一个文件,该文件将放置在每小时运行的作业调度程序上。该脚本必须导航到具有昨天日期的文件夹(远程/路径/ yyyymmdd /)。文件名还具有昨天的日期和时间戳(filename_yyyymmdd_hhmmss.dat)。由于将安排工作,因此我的脚本必须包含前一个小时-例如。如果作业在11:02运行,则要检索的文件将是filename_yyyymmdd_10mmss.dat。分钟和秒总是一样的-ex4949。远程目录中将有多个文件,我只想检索最新的文件,这样我们的作业就不会处理多个输入文件。远程目录中还将定期创建其他文件,因此我无法仅检索上次修改的文件。

我有一些变量可以返回昨天的日期和前一个小时,但是sftp命令没有返回完整的文件名,也没有检索文件。我尝试使用方括号,引号和括号将变量连接起来,将多个变量分配给单个变量,然后导出变量。

vdate=$(TZ=bb24 date '+%Y%m%d')
vhour=$(date '+%H')
prevhour=$((vhour - 1))

sftp user@host << EOF
lcd /my/dir/
cd /remote/path/$vdate/
get filename_$vdate_$prevhour*.dat
bye
EOF
exit

运行脚本时,找不到文件,并且没有完整的文件名 返回:

File "/remote/path/20190411/filename_20190411" not found.

代替

File "/remote/path/20190411/filename_20190411_10*.dat" not found.

我尝试的每个变量组合都返回未找到的相同变量-在filename_ $ vdate之后结束。

我尝试了一些其他组合,但始终找不到:

newvar=${vdate}_${prevhour}
get filename_$newvar*.dat

newvar=${vdate}\\_${prevhour}
get filename_$newvar*.dat
File "/remote/path/20190411/filename_20190411" not found.

1 个答案:

答案 0 :(得分:1)

您在prevhour=$((vhour - 1))的脚本中遇到问题 这样,减去后的文本02将是1而不是01,并且它将与不需要的文件匹配,甚至没有匹配,因为00 - 1是{{1 }}

-1

日期的[edvin]$ vdate=$(TZ=bb24 date '+%Y%m%d') [edvin]$ vhour=$(date '+%H') [edvin]$ prevhour=$((vhour - 1)) [edvin]$ echo $vhour 03 [edvin]$ echo $prevhour 2 [edvin]$ prevhour=$(date -d '1 hour ago' '+%H') [edvin]$ echo $prevhour 02 选项在某些系统上不可用。

我相信,在您的尝试中,外壳程序被视为-d变量*的一部分,因为您没有将其放入将变量与混乱文本分开的prevhour中。 / p>

这是我根据您的尝试而制定的解决方案:

{}

输出:

#!/bin/ksh

r_host='server2'
r_user='edvin'
l_dir='./content'
r_dir='./Test_folder'

# this still not cover the case of midnight
# it put 00 to 23 but day have to be yesterday as well
##vdate=$(TZ=bb24 date '+%Y%m%d')
##vhour=$(date '+%H')                      # not used
##prevhour=$(date -d '1 hour ago' '+%H')

# vtime = YYYYmmdd_HH -1 H
vtime=$(TZ=bb24 date -d '1 hour ago' '+%Y%m%d_%H')

sftp ${r_user}@${r_host} << EOF
lcd ${l_dir}
cd ${r_dir}
get filename_${vtime}*.dat
bye
EOF

exit

在此解决方案中,仍有很多事情可能会出错, 就像如果远程目录不存在,不可访问一样,脚本将继续执行其余命令,本地目录和文件也是如此。该连接还会运行您可能要处理的各种问题。您希望对其进行计划,因此可能需要一种解决方案来避免脚本重复生成(如果已经运行的话)。

[edvin]$ ./script.ksh Connected to server2. sftp> lcd ./content sftp> cd ./Test_folder sftp> get filename_20190415_02*.dat Fetching /home/edvin/Test_folder/filename_20190415_020000.dat to filename_20190415_020000.dat Fetching /home/edvin/Test_folder/filename_20190415_020100.dat to filename_20190415_020100.dat Fetching /home/edvin/Test_folder/filename_20190415_020200.dat to filename_20190415_020200.dat Fetching /home/edvin/Test_folder/filename_20190415_020300.dat to filename_20190415_020300.dat Fetching /home/edvin/Test_folder/filename_20190415_020400.dat to filename_20190415_020400.dat Fetching /home/edvin/Test_folder/filename_20190415_020500.dat to filename_20190415_020500.dat Fetching /home/edvin/Test_folder/filename_20190415_020600.dat to filename_20190415_020600.dat Fetching /home/edvin/Test_folder/filename_20190415_020700.dat to filename_20190415_020700.dat Fetching /home/edvin/Test_folder/filename_20190415_020800.dat to filename_20190415_020800.dat Fetching /home/edvin/Test_folder/filename_20190415_020900.dat to filename_20190415_020900.dat Fetching /home/edvin/Test_folder/filename_20190415_021000.dat to filename_20190415_021000.dat sftp> bye 是执行此操作的首选方法,因为您使用的密码少了身份验证。

如果出于某种原因不能选择scp,那么使用scp可以很好地解决此问题。