gpt4 book ai didi

linux - bash 变量的奇怪行为

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:49 25 4
gpt4 key购买 nike

我遇到以下情况,我尝试使用以下脚本在我的一个脚本中的指定 SSH 端口上访问我的 jenkins 环境。

但是由于某些原因,变量与变量有一些奇怪的行为。

回显变量时它看起来很正常。当回显字符串中的变量时,它不会显示,除非它在字符串的末尾在 ssh 命令中使用变量时,它会打乱整个 ssh 命令。

我错过了什么?我可以做些什么来进一步排除故障?

$ ssh_port=$(curl -vsL http://localhost/login 2>&1 | grep 'X-SSH-Endpoint' | cut -d':' -f 3)
$ echo $ssh_port
44149
$ echo "${ssh_port} jenkins port"
jenkins port
$ echo "Jenkins port ${ssh_port}"
Jenkins port 44149
$ ssh -p $ssh_port localhost
'ad port '44149

更新:

按照评论中的建议,我尝试按照 2 个命令进行故障排除。

$ printf %s "$ssh_port" | xxd
00000000: 3434 3134 390d 44149.
$ od -c <<<"$ssh_port"
0000000 4 4 1 4 9 \r \n
0000007

有没有关于在没有这些奇怪字符的情况下实现我想要的方法的任何建议?

最佳答案

您已确认变量内有回车符。

在 bash 或任何支持 ANSI C(格式)扩展的 POSIX shell 中,您可以像这样轻松解决此问题:

$ ssh_port=$'44149\r'
$ od -c <<<"$ssh_port"
0000000 4 4 1 4 9 \r \n
0000007
$ new_port="${ssh_port%$'\r'}"
$ od -c <<<"$new_port"
0000000 4 4 1 4 9 \n
0000006

${variable%text} 扩展为 $variable 的内容,从字符串末尾删除了 text,并且 $'\r' 当然是换行了

您也可以在填充变量的管道中删除回车符:

$ ssh_port=$(curl -vsL http://localhost/login 2>&1 | tr -d '\r' | sed -ne 's/^X-SSH-Endpoint: [^:]*://p')

甚至,

$ read ssh_port < <(curl -vsL http://localhost/login 2>&1 | grep '^X-SSH-Endpoint:' | grep -E -o '[0-9]+')

最后,单独的参数扩展可以隔离行的数字部分:

$ while read t; do [[ $t == X-SSH-Endpoint:* ]] && ssh_port="${t//[^0-9]/}" && break; done < <(curl -vsL http://localhost/login 2>&1)

或者,如果您想将 header 及其值视为单独的变量,并允许主机名包含数字的可能性:

$ while read h v; do [[ $h == X-SSH-Endpoint: ]] && { v="${v#*:}"; ssh_port="${v//[^0-9]/}"; break; }; done < <(printf 'one\r\n%s\nthree\r\n' "$s")

这么多的选择。 :-)

关于linux - bash 变量的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42807752/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com