我遇到以下情况:尝试使用以下脚本,以便在我的一个脚本中访问指定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
在没有这些奇怪的角色的情况下,是否有任何关于实现我想要的方法的建议?
答案 0 :(得分:0)
您可以尝试
ssh_port=$(curl -vsL http://localhost/login 2>&1 | sed '
/X-SSH-Endpoint/!d # replace grep
s/\r$// # remove line ending CR
s/.*:// # remove up to last colon
')
答案 1 :(得分:0)
您已确认在变量中有回车符。
在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)
或者,如果您想将标题及其值视为单独的变量,并允许包含数字的主机名的可能性:
$ 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")
这么多选择。 : - )