使用包含符号的参数调用Bash函数
我想要一个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
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”--它被执行(在前台,vsP=1
发生在后台的子shell中,该子shell在完成一行/三个字符的命令后退出)。如果在同一个shell中运行echo“$Q”
,则输出将是2
。Re:“Q=2去了哪里”--它被执行(在前台,vsP=1
发生在子shell的后台,在完成一行/三个字符的命令后退出)。如果在同一个shell中运行echo“$Q”
,输出将是2
。