Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 未通过SFTP get命令返回多变量字符串_Shell_Concatenation_Ksh - Fatal编程技术网

Shell 未通过SFTP get命令返回多变量字符串

Shell 未通过SFTP get命令返回多变量字符串,shell,concatenation,ksh,Shell,Concatenation,Ksh,我正在编写一个ksh脚本,通过sftp每小时检索一个文件,该文件将放在作业调度器上,每小时运行一次。脚本必须导航到日期为昨天的文件夹(remote/path/yyyymmdd/)。文件名还有昨天的日期和时间戳(filename_yyyymmdd_hhmmss.dat)。由于作业将被安排,我的脚本必须包括前一个小时-例如。如果作业在11:02运行,则要检索的文件将是filename_yyymmdd_10mmss.dat。分钟和秒总是一样的-例如4949。远程目录中将有多个文件,我只想检索最新的文件

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

我有一些变量要返回昨天的日期和前一个小时,但是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_10*.dat" not found.
我尝试的每个变量组合都返回相同的not found-在filename_$vdate之后结束

我尝试了一些其他组合,但始终没有找到相同的组合:

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


您的脚本在
prevhour=$((vhour-1))
通过这种方式,文本
02
在进行减法运算后,它将是
1
而不是
01
,并且它将与不需要的文件匹配,甚至不会匹配,因为
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
,因为您没有将它放入将变量与排序文本分开的
{}

这是我的工作解决方案,基于您的尝试:

#!/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
在这个解决方案中还有很多地方可能出错, 就像远程目录不存在、不可访问一样,脚本仍将继续执行命令的其余部分,本地目录和文件也是如此。连接还可能会运行您可能希望处理的各种问题。您希望对其进行调度,这样可能需要一个解决方案来避免脚本在已经运行的情况下反复生成

scp
将是更可取的方法,因为您使用的是无密码身份验证


如果由于某种原因,
scp
不是一个选项,那么使用
expect
可以很好地处理这个问题。

*(s)ftp
客户端是出了名的问题(我没有说bug:-)。您的代码看起来应该可以工作。我将手动运行
sftp
并输入每个CMD。当您到达
get file…
时,我将用
dir file…*
和1替换它。确认文件确实在那里,然后2。查看是否发现了
文件名\u$vdate\u$prevhour*.dat
不起作用的原因。如果您可以通过手动键入所有内容使其正常工作,那么您必须查看
ksh
正在处理的内容。更难在这里做一个医生。。。。啊,即使只有一个文件,也可能需要使用
mget
*
可能会把它扔掉。。。。否则,在单独的终端窗口中,手动执行分配到
filename\u$vdate\u$prevhour*.dat
,然后在命令行上
echo filename\u$vdate\u$prevhour*.dat
,并将该值复制/粘贴到
sftp
会话中。祝你好运请尝试使用此格式
获取文件名\u${vdate}{u${prevhour}*.dat
@shelleter@edvin我尝试了这两种方法,但均未成功。手动运行命令并回显返回所需的输出,但一旦我通过sftp手动输入命令,输出就不匹配。sftp客户端中是否可能存在字符限制或变量数量限制?我可能最终只是检索
filename*
并让脚本删除不是前一个小时的副本。我最终使用
mget*.dat
然后使用
ls-1 filename*.dat | sort-r | tail+2 | xargs-I rm{}退出sftp
根据文件名中的时间戳删除除最新版本以外的所有版本。我无法通过sftp正确执行命令。
File "/remote/path/20190411/filename_20190411" not found.
[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
#!/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