将参数转义为 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; }
首先我将描述问题。我经常将文件从我的 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; }