将参数转义为 bash 函数

Escaping parameter to bash function

首先我将描述问题。我经常将文件从我的 linux 桌面复制到我的 android 平板电脑。由于我不想深入的原因,我发现最简单的方法是在我的平板电脑上使用 运行 sshDroid(一个 ssh 服务器),并使用 shell 中的 scp 到复制文件过来。 scp 命令采用以下形式:

scp -P 2222 ./some\ document\:\ with\ subtitle\ -\ author.txt \
            root@197.157.0.211:/sdcard/uploads

此表达式中唯一改变的是文件名,这很容易通过制表符完成来实现。甚至IP地址都没有变化。由于我经常上传文件,所以我非常希望不要一遍又一遍地输入相同的字符。为此,我想我会写一个 shell 函数并将其附加到 .bashrc。我写的函数如下:

upload(){ scp -P 2222 $@ root@192.168.0.151:/sdcard/uploads; }

它的用法应该是:

upload ./some\ document\:\ with\ subtitle\ -\ author.txt

但是当我尝试它时,我得到以下输出:

SSHDroid
Use 'root' as username
Default password is 'admin'
root@192.168.0.151's password: 
./some: No such file or directory
ssh: Could not resolve hostname document: Name or service not known
with: No such file or directory
subtitle: No such file or directory
-: No such file or directory
author.txt: No such file or directory

看起来 bash 在将文件名传递给函数之前自动取消转义文件名,由于名称中的空格,scp 命令将其视为多个文件名。

我的问题是:如何保留参数中的反斜杠,否则如何在函数中重新转义它?在摆弄了一段时间之后,我非常想写一个简单的 python 脚本并将其放入 /usr/local/bin。我还缺少其他 bash 原生解决方案吗?

引用!

未加引号,$@ 的行为与 $* 相同;如果要保留原始标记化,则需要改用 "$@"。因此:

upload() { scp -P 2222 "$@" root@192.168.0.151:/sdcard/uploads; }