bash变量的奇怪行为

时间:2017-03-15 10:56:30

标签: linux bash jenkins ssh environment-variables

我遇到以下情况:尝试使用以下脚本,以便在我的一个脚本中访问指定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

在没有这些奇怪的角色的情况下,是否有任何关于实现我想要的方法的建议?

2 个答案:

答案 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")

这么多选择。 : - )