将参数转义到bash函数

将参数转义到bash函数,bash,escaping,scp,bash-function,Bash,Escaping,Scp,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 这个表达式中唯一改变的是文件

首先,我将描述这个问题。我经常将文件从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; }
引用

不带引号,
$@
的行为与
$*
相同;如果要保留原始标记化,则需要使用
“$@”
。因此:

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

问题不是“逃避”,而是字符串拆分。在解析过程的早期总是会出现不可回避的情况,但这应该是一个特性,而不是一个bug。问题是,当您的未转载内容因为没有正确引用而被拆分或展开时。顺便说一句,如果你的目标是对执行模型有一个很好的理解[而BashParser页面仍然让你不那么自信],BashFAQ#50触及了与这个问题背后的一些误解相同的主题;看,问题不是“逃避”,而是字符串拆分。在解析过程的早期总是会出现不可回避的情况,但这应该是一个特性,而不是一个bug。问题是,当您的未转载内容因为没有正确引用而被拆分或展开时。顺便说一句,如果你的目标是对执行模型有一个很好的理解[而BashParser页面仍然让你不那么自信],BashFAQ#50触及了与这个问题背后的一些误解相同的主题;看它的工作!谢谢你的回答和深入的链接。它很有效!谢谢你的回答和深入的链接。