我正在尝试编写一个bash别名/函数,它采用ftp路径并运行lftp
到pget
文件。
给定一个远程路径,空格编码为%20
,如:
sftp://ftp.example.com/Some%20Folder/BigFile.mov
我有这个片段来清理URL的%20
和服务器部分:
echo $1 | sed 's/%20/ /g' | sed 's/sftp:\/\/ftp.example.com//g';
给了我
/Some Folder/BigFile.mov
现在我需要通过lftp
这样运行:
lftp sftp://ftp.example.com -u user,pass -e "pget -cn10 '/Some Folder/BigFile.mov'"
我想创建一个带有此命令功能的别名,让我们称之为lget
,这样我就可以使用原始网址了:
lget "sftp://ftp.example.com/Some%20Folder/BigFile.mov"
此处的解决方案应该类似
alias lget='function _lget(){ lftp ... };_lget'
但是我完全迷失了如何在函数中包含参数,通过sed
处理它,以及如何处理嵌套的引号。
我可能需要一些反击......
答案 0 :(得分:0)
这样的东西?
lget () {
local filename=${1#sftp://ftp.example.com}
lftp sftp://ftp.example.com -u user,pass -e "pget -cn10 '${filename//%20/ }'"
}
我不明白你为什么要创建一个具有无用名称的函数,只是为了能够将有用的名称分配给一个简单调用该函数的别名(尽管这似乎是某些圈子中的常态) ,由于我不知道的原因)。
您不需要sed
,因为Bash包含用于字符串替换的内置函数。如果您需要将其移植到缺少${variable//global/replacement}
功能(以及local
关键字)的POSIX shell,请注意properly quote传递给sed
的字符串。 (用于检索带有前缀的变量值的${variable#prefix}
语法在POSIX shell中可用。哦,对于记录,单个sed
脚本可以执行多个替换; sed -e 's/foo/bar/' -e 's/baz/quux/g'
。)