我需要创建一个带有包含昨天日期的变量值的路径。我需要使用 SFTP 获取文件。这是我的尝试。
#/bin/bash
TS=$(date -d '30 mins ago' +"%Y%m%d")
sshpass -p '12#$' sftp -P 2222 [email protected] <<'END_SFTP'
get /newNE/PSData$TS* /data/processedfiles
END_SFTP
但TS
日期值没有传递到远程服务器来获取数据。
File "/newNE/PSData$TS*" not found.
有人可以帮我解决这个问题吗?
答案1
对于要在此处文档内执行的参数扩展(以及命令替换和算术扩展以及行继续处理),分隔符的任何部分都不能被引用,因此:
#! /bin/sh -
ts=$(date -d '30 mins ago' +"%Y%m%d")
SSHPASS='12#$' sshpass -e sftp -P 2222 [email protected] <<END_SFTP
get /newNE/PSData$ts* /data/processedfiles
END_SFTP
另请注意:
- 密码不应在命令行上传递,该命令行在某些记帐日志的输出中
ps
或有时在某些记帐日志中公开可用。将它们作为环境变量传递通常很好,因为这通常被认为是私有的。更好的是使用公钥身份验证。您需要确保对脚本的读取访问受到限制并且它包含该密码。 - shebangs 开头,
#!
后面是通往解释器的路径。添加 a-
也是一个很好的做法。如果只有#/bin/bash
,那只是一条注释,因此在没有 shebang 的情况下,您的系统可能会运行sh
来解释脚本。 - 然而,在这里,该脚本中没有任何
bash
特定的内容,因此您不妨使用sh
并删除该依赖项bash
(并且在运行脚本时可能会使用更少的资源,除非您所在的系统/bin/sh
是bash
)。 - 在这里,您确实依赖于 GNU
date
(对于该非标准-d
选项),它的可移植性甚至比bash
(bash 是 GNU shell,但也常见于非 GNU 系统)更差。如果使用bash
,您可以通过定义ts
为printf -v ts '%(%Y%m%d)T' "$(( EPOCHSECONDS - 30 * 60 ))"
(printf -v EPOCHSECONDS '%(%s)T' -1
在旧版本的后面bash
)来删除该依赖性。