2016-03-03 43 views
0

我正試圖編寫一個bash別名/函數,它需要一個ftp路徑並運行lftppget該文件。bash腳本使用ftp路徑運行lftp

鑑於遠程路徑,用空格編碼爲%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,這樣我就可以使用原來的URL :

lget "sftp://ftp.example.com/Some%20Folder/BigFile.mov"

這裏的解決方案應該喜歡的東西,像

alias lget='function _lget(){ lftp ... };_lget' 

但是我完全失去了如何在函數中包含參數,是否通過sed處理了它,以及如何處理嵌套的引號。

我可能需要一些反引號...

+0

使用的功能,而不是一個別名的其餘的應該很容易。 – tripleee

+0

對不起,我沒有很多bash腳本知識;你將如何編寫函數以在'lftp'命令中包含處理後的URL? –

回答

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外殼,請注意您傳遞給sed的字符串properly quote。 (該${variable#prefix}語法來檢索與去除的前綴的變量的值是在POSIX殼可用哦,並作記錄,單個sed腳本可以執行多個取代; sed -e 's/foo/bar/' -e 's/baz/quux/g'

+0

太棒了!有用!我只提到了別名中的函數,因爲我看到了這個:http://stackoverflow.com/questions/941338/how-to-pass-command-line-arguments-to-a-shell-alias;沒有意識到這個功能本身就夠了。謝謝! –

+0

還有一個問題......可以將該功能寫入一行嗎?換行符在bash中很重要,對吧? –

+0

換行符可以用分號替換。大括號後面不需要一個。不過,我不清楚爲什麼你會有這樣的要求。 – tripleee