多变量字符串未通过 SFTP get 命令返回
Multi-variable string not being returned via SFTP get command
我正在编写一个 ksh 脚本,通过 sftp 每小时检索一个文件,该文件将被放在作业调度程序上 运行 每小时一次。该脚本必须导航到具有昨天日期的文件夹 (remote/path/yyyymmdd/)。文件名还有昨天的日期和时间戳 (filename_yyyymmdd_hhmmss.dat)。由于将安排工作,因此我的脚本必须包括前一小时 - 例如。如果作业 运行 位于 11:02,要检索的文件将是 filename_yyyymmdd_10mmss.dat。分钟和秒将始终相同 - 例如 4949。远程目录中将有多个文件,我只想检索最新的一个,这样我们的作业就不会处理多个输入文件。远程目录还会定期创建其他文件,所以我不能只检索最后修改的文件。
我有 return 昨天和前一小时的变量,但 sftp 命令没有 return 完整的文件名,也没有检索文件。我试过连接变量,使用方括号和引号和括号,将多个变量分配给单个变量,然后导出变量。
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
当运行执行脚本时,找不到文件且没有完整的文件名
return编辑:
File "/remote/path/20190411/filename_20190411" not found.
而不是
File "/remote/path/20190411/filename_20190411_10*.dat" not found.
我尝试的每个变量组合 return 均未找到 - 在 filename_$vdate 之后结束。
我试过其他一些组合,但总是找不到相同的组合:
newvar=${vdate}_${prevhour}
get filename_$newvar*.dat
和
newvar=${vdate}\_${prevhour}
get filename_$newvar*.dat
File "/remote/path/20190411/filename_20190411" not found.
你的脚本有问题 prevhour=$((vhour - 1))
这样,减法后的文本 02
将是 1
而不是 01
并且它将匹配不需要的文件,甚至 none 为 00 - 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
选项在某些系统上不可用。
我相信在您的尝试中,shell 被视为 *
作为变量 prevhour
的一部分,因为您没有将它放入 {}
中来自 sor运行ding text.
的变量
这是我根据您的尝试得出的可行解决方案:
#!/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
由于某种原因不是一个选项,使用 expect
可以很好地处理。
我正在编写一个 ksh 脚本,通过 sftp 每小时检索一个文件,该文件将被放在作业调度程序上 运行 每小时一次。该脚本必须导航到具有昨天日期的文件夹 (remote/path/yyyymmdd/)。文件名还有昨天的日期和时间戳 (filename_yyyymmdd_hhmmss.dat)。由于将安排工作,因此我的脚本必须包括前一小时 - 例如。如果作业 运行 位于 11:02,要检索的文件将是 filename_yyyymmdd_10mmss.dat。分钟和秒将始终相同 - 例如 4949。远程目录中将有多个文件,我只想检索最新的一个,这样我们的作业就不会处理多个输入文件。远程目录还会定期创建其他文件,所以我不能只检索最后修改的文件。
我有 return 昨天和前一小时的变量,但 sftp 命令没有 return 完整的文件名,也没有检索文件。我试过连接变量,使用方括号和引号和括号,将多个变量分配给单个变量,然后导出变量。
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
当运行执行脚本时,找不到文件且没有完整的文件名 return编辑:
File "/remote/path/20190411/filename_20190411" not found.
而不是
File "/remote/path/20190411/filename_20190411_10*.dat" not found.
我尝试的每个变量组合 return 均未找到 - 在 filename_$vdate 之后结束。
我试过其他一些组合,但总是找不到相同的组合:
newvar=${vdate}_${prevhour}
get filename_$newvar*.dat
和
newvar=${vdate}\_${prevhour}
get filename_$newvar*.dat
File "/remote/path/20190411/filename_20190411" not found.
你的脚本有问题 prevhour=$((vhour - 1))
这样,减法后的文本 02
将是 1
而不是 01
并且它将匹配不需要的文件,甚至 none 为 00 - 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
选项在某些系统上不可用。
我相信在您的尝试中,shell 被视为 *
作为变量 prevhour
的一部分,因为您没有将它放入 {}
中来自 sor运行ding text.
这是我根据您的尝试得出的可行解决方案:
#!/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
由于某种原因不是一个选项,使用 expect
可以很好地处理。