如何卷曲不区分大小写

Sae*_*eed 6 linux curl

如果我使用此链接安装 docker-compose,则会出现“未找到”错误:

[root@hostname ~]# curl -L "https://github.com/docker/compose/releases/download/2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o here
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     9  100     9    0     0     37      0 --:--:-- --:--:-- --:--:--    37
[root@hostname ~]# cat here
Not Found
Run Code Online (Sandbox Code Playgroud)

这是因为实际文件是docker-compose-linux-x86_64l, 而:

[root@hostname ~]# echo $(uname -s)-$(uname -m)
Linux-x86_64
Run Code Online (Sandbox Code Playgroud)

它返还资本L

我看到man curl但没有看到任何用于检查不区分大小写链接的条目。

use*_*686 35

并不是curl决定了\xe2\x80\x93链接的大小写不敏感,“检查”是服务器的决定。

\n

(换句话说,HTTP 客户端没有机会查看所有可能的 URL 列表并选择一个匹配的 URL。HTTP客户端唯一能做的就是向服务器提供准确的 URL,并让服务器决定如何响应.有些服务器不区分大小写,有些则不区分。)

\n

但是如果你已经知道你需要一个小写的“linux”,你可以在将输出提供给curl之前转换输出uname,例如通过管道将所有大写字母更改为小写:tr A-Z a-z

\n
docker-$(uname -s | tr A-Z a-z)\n
Run Code Online (Sandbox Code Playgroud)\n

或者使用 Bash 的${var,,}扩展来返回 的小写版本$var

\n
os=$(uname -s); arch=$(uname -m)\n\ndocker-${os,,}-${arch}\n
Run Code Online (Sandbox Code Playgroud)\n

最后,由于只有一小部分接受的值,并且由于接受的值通常不能保证是“unname but lowercase”,因此您可以间接分配每个可能的值(使用ifcase块),例如:

\n
case $(uname -s) in\n    Darwin)    docker_os='darwin';;\n    Linux)     docker_os='linux';;\n    Cygwin)    docker_os='windows';;\n    Microsoft) docker_os='windows';;\n    *)         echo "Docker is not supported on this OS!" >&2; exit 1;;\nesac\n
Run Code Online (Sandbox Code Playgroud)\n

(注:“windows”示例完全是虚构的。)

\n

  • @Fiisch:这是服务器的决定,因为规范中没有任何内容会禁止服务器在 /FOO 和 /foo 处提供相同的资源(如果他们愿意的话)。从客户端的角度来看,该路径只需要“区分大小写”,即,这样奇怪的客户端(或代理)就不会在将路径发送到服务器之前尝试对路径进行不必要的大小写折叠(因此实际上要求服务器变为大小写)对此不敏感),就像一些客户已经将域名小写一样。 (9认同)
  • 它没有*必须*覆盖该语句,因为服务器在任何 URL 上实际提供的内容已经超出了方案定义的范围。它仅意味着具有路径 /FOO 和 /foo 的实际 URL 不得被视为“相同的 URL”,但它们仍然可以具有相同的可用内容。 (6认同)

Kam*_*ski 17

域名后面部分的大小写由服务器决定

\n

要完全模拟服务器的不区分大小写,curl必须尝试所有可能的组合(\xe2\x80\xa6LiNUx\xe2\x80\xa6, \xe2\x80\xa6linUX\xe2\x80\xa6),并且它们的数量非常多。

\n

如果您知道服务器使用全小写字符串,那么合理的做法是在提供给curl. 重击示例:

\n
url="https://github.com/docker/compose/releases/download/2.9.0/docker-compose-$(uname -s)-$(uname -m)"\nurl="${url,,}"\ncurl -L "$url" -o here\n
Run Code Online (Sandbox Code Playgroud)\n

但正确的 URL 是 with v2.9.0,并且有问题的服务器实际上对该组件不区分大小写docker-compose-\xe2\x80\xa6。对您来说最简单的修复就是添加缺少的v

\n
curl -L "https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-$(uname -s)-$(uname -m)" -o here\n#                                           this was missing ^\n
Run Code Online (Sandbox Code Playgroud)\n

没有这个,v任何转换都无济于事。

\n

  • `url="${url,,}"` 啊,unix shell 中不言自明的代码众所周知的清晰度...... (10认同)
  • XY问题,阿米莱特? (4认同)

mas*_*ice 6

正如其他人已经指出的那样,不区分大小写是在服务器端配置的,您无法从计算机上更改它。

\n

但是,您可以使用其他一些工具将字符串转换为小写:

\n
\xe2\x95\xad\xe2\x94\x80user@machine ~ \xe2\x80\xb9main\xe2\x80\xba \n\xe2\x95\xb0\xe2\x94\x80$ echo $(uname -s)-$(uname -m) | tr '[:upper:]' '[:lower:]'                                                                                                                                             \nlinux-x86_64\n
Run Code Online (Sandbox Code Playgroud)\n