如何不区分大小写

如何不区分大小写

如果我使用此链接安装 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

这是因为实际文件docker-compose-linux-x86_64较小l,而:

[root@hostname ~]# echo $(uname -s)-$(uname -m)
Linux-x86_64

它返回资本L

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

答案1

大小写不敏感并不是 curl 决定的,而是链接“检查”服务器的决定。

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

但如果你已经知道需要小写的“linux”,那么你可以直接转换uname输出将其交给 curl,例如通过管道tr A-Z a-z将所有大写字母更改为小写:

docker-$(uname -s | tr A-Z a-z)

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

os=$(uname -s); arch=$(uname -m)

docker-${os,,}-${arch}

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

case $(uname -s) in
    Darwin)    docker_os='darwin';;
    Linux)     docker_os='linux';;
    Cygwin)    docker_os='windows';;
    Microsoft) docker_os='windows';;
    *)         echo "Docker is not supported on this OS!" >&2; exit 1;;
esac

(注:‘windows’示例完全是虚构的。)

答案2

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

为了完全模拟服务器的不区分大小写,curl必须尝试所有可能的组合(…LiNUx……linUX…),而这样的组合数量是巨大的。

如果你知道服务器使用全小写字符串,那么一个合理的做法是在提供给之前将 URL 转换为小写curl。Bash 示例:

url="https://github.com/docker/compose/releases/download/2.9.0/docker-compose-$(uname -s)-$(uname -m)"
url="${url,,}"
curl -L "$url" -o here

但正确的 URL 是v2.9.0,并且有问题的服务器实际上是不区分大小写对于docker-compose-…组件。最简单的修复方法是添加缺失的v

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

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

答案3

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

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

╭─user@machine ~ ‹main› 
╰─$ echo $(uname -s)-$(uname -m) | tr '[:upper:]' '[:lower:]'                                                                                                                                             
linux-x86_64

相关内容