使用包含符号的参数调用Bash函数

使用包含符号的参数调用Bash函数,bash,aria2,Bash,Aria2,我想要一个bash函数来转换这个 download HELLO&P=1&Q=2 进入这个 aria2c -d ~/Downloads "HELLO&P=1&Q=2" 你好&p=1&Q=2是一个磁铁链接。如果周围没有双引号,aria2c就不起作用。但我似乎不能把一切都放在一起。问题似乎是磁铁链接的末端有一系列的&key=value对(在我的示例中&P=1&Q=2),这些对似乎被剥离并与链接的其余部分分离(即HELLO) 这是我的.bash\u配置文件函数 dow

我想要一个bash函数来转换这个

download HELLO&P=1&Q=2
进入这个

aria2c -d ~/Downloads "HELLO&P=1&Q=2"
你好&p=1&Q=2
是一个磁铁链接。如果周围没有双引号,aria2c就不起作用。但我似乎不能把一切都放在一起。问题似乎是磁铁链接的末端有一系列的
&key=value
对(在我的示例中
&P=1&Q=2
),这些对似乎被剥离并与链接的其余部分分离(即
HELLO

这是我的
.bash\u配置文件
函数

download() {
  aria2c -d ~/Downloads "$1"
}
下面是一个示例输出

~ $ download HELLO&P=1&Q=2
[1] 7389
[2] 7390
aria2c -d /Users/lukejanicke/Downloads HELLO
[1]-  Done                    download HELLO
[2]+  Done                    P=1
~ $ 
甚至不知道Q=2到哪里去了。对于真正的磁铁链接,所有零件都以这种枚举方式显示


我需要一些方法来捕获整个磁铁链接作为单个参数,然后执行带有引号的
aria2c
命令。

&
是shell中的一个特殊字符。您需要引用包含它的字符串:

download 'HELLO&P=1&Q=2'

否则,它被理解为在后台运行左侧的命令分隔符。

&
是shell中的一个特殊字符。您需要引用包含它的字符串:

download 'HELLO&P=1&Q=2'

否则,它被理解为在后台运行左侧的命令分隔符。

双引号使bash解释内部字符串

我用以下方法对其进行了测试:

$ download() {   aria2c -d ~/Downloads "$1"; }
victor 0 12:48 /Users/victor/tmp

$ download "http://localhost:8080/HELLO&P=1&Q=2"

10/07 12:48:56 [NOTICE] Downloading 1 item(s)

10/07 12:48:56 [ERROR] CUID#7 - Download aborted. 
URI=http://localhost:8080/HELLO&P=1&Q=2E

双引号使bash能够解释内部字符串

我用以下方法对其进行了测试:

$ download() {   aria2c -d ~/Downloads "$1"; }
victor 0 12:48 /Users/victor/tmp

$ download "http://localhost:8080/HELLO&P=1&Q=2"

10/07 12:48:56 [NOTICE] Downloading 1 item(s)

10/07 12:48:56 [ERROR] CUID#7 - Download aborted. 
URI=http://localhost:8080/HELLO&P=1&Q=2E

是的,注意当你调用下载时,你也可以使用单引号。这解决了你的问题吗?@lukejanicke,如果你没有把它们放在用户输入的链接周围,shell怎么知道用户没有要求它在后台运行
download HELLO
,在后台运行一个单独的命令
P=1
,在前台有一个单独的命令
P=2
?你是说没有办法?这就是bash的工作原理?我可以接受。我只是在学习。如果不将url设置为有效的shell命令,通常无法将其复制粘贴到shell提示符中,但您肯定可以编写一个命令,该命令接收一个充满url的文件,或者提示您粘贴url而不需要加引号。@lukejanicke是的,bash就是这样工作的。不仅仅是bash,任何符合posixshell语法规则的shell。在任何POSIX shell中,如果命令行包含的
&
既不是转义的,也不是引号(或复合语法元素的一部分,如
&
),则它将被解析为命令之间的分隔符,而不是命令或其参数的一部分。是的,请注意,在调用download时,也可以使用单引号。这解决了你的问题吗?@lukejanicke,如果你没有把它们放在用户输入的链接周围,shell怎么知道用户没有要求它在后台运行
download HELLO
,在后台运行一个单独的命令
P=1
,在前台有一个单独的命令
P=2
?你是说没有办法?这就是bash的工作原理?我可以接受。我只是在学习。如果不将url设置为有效的shell命令,通常无法将其复制粘贴到shell提示符中,但您肯定可以编写一个命令,该命令接收一个充满url的文件,或者提示您粘贴url而不需要加引号。@lukejanicke是的,bash就是这样工作的。不仅仅是bash,任何符合posixshell语法规则的shell。在任何POSIX shell中,如果命令行包含的
&
既不是转义的,也不是引号(或类似
&
的复合语法元素的一部分),那么它将被解析为命令之间的分隔符,而不是命令或其参数的一部分。Re:“where Q=2 go”--它被执行(在前台,vs
P=1
发生在后台的子shell中,该子shell在完成一行/三个字符的命令后退出)。如果在同一个shell中运行
echo“$Q”
,则输出将是
2
。Re:“Q=2去了哪里”--它被执行(在前台,vs
P=1
发生在子shell的后台,在完成一行/三个字符的命令后退出)。如果在同一个shell中运行
echo“$Q”
,输出将是
2