当尝试从字符串中提取子字符串IMAGE_TAG
时,变量:R8A144
中的字符串为空:
载入的图片:rcsmw-ee:R8A144
由Jenkins中的grep -oP
执行外壳程序:
代码如下:
ssh -o "StrictHostKeyChecking=no" -o UserKnownHostsFile=/dev/null eccd@${DIRECTOR_IP_NUM} '
LOADED_IMAGE=$(sudo su root -c "docker load -i rcsmw-ee-5940688.4.tar")
IMAGE_TAG=$(echo $LOADED_IMAGE | grep -oP '\(:[A-ZA]\)\w+')
echo $IMAGE_TAG
'
这是输出:
bash: command substitution: line 5: syntax error near unexpected token `('
bash: command substitution: line 5: `echo $LOADED_IMAGE | grep -oP (:[A-ZA])w+)'
Error parsing reference: "rcsmw-ee:" is not a valid repository/tag: invalid reference format
答案 0 :(得分:0)
您在单引号内包含一整套命令,因此不能在grep
模式周围使用单引号。
此外,"$LOADED_IMAGE"
也最好用双引号,因为如果包含空格,可能会引起麻烦。
此外,A
之后的A-Z
和捕获组一样都是多余的,您可以删除模式中的括号并使用
IMAGE_TAG=$(echo "$LOADED_IMAGE" | grep -oP -m 1 ":[A-Z]\w*")
或者,使用等效的POSIX BRE正则表达式:
IMAGE_TAG=$(echo "$LOADED_IMAGE" | grep -o -m 1 ":[[:upper:]][[:alnum:]_]*")
请注意,-m 1
与grep
只会提取第一个匹配项,这似乎是您在此找到的匹配项。
答案 1 :(得分:0)
另一个解决方案是将ssh与以下标记一起使用: ssh -o“ StrictHostKeyChecking = no” -o UserKnownHostsFile = / dev / null eccd @ $ {DIRECTOR_IP_NUM} <<'SSHTAG' 。 IMAGE_TAG = $(回显$ LOADED_IMAGE | grep -oP'(:[A-ZA])\ w +') 。 。 SSHTAG