如何在另一个eval块中使用shell变量



我想有条件地评估一个变量,以便在我的docker镜像构建中使用

RUN ARCHFLAG="$(uname -m)" && ARCH=$([ $ARCHFLAG == "aarch64" ] &&  echo "arm64" ||  echo $ARCHFLAG) && curl -sL "https://get.helm.sh/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz" | tar -xvz && 
mv linux-${ARCH}/helm /usr/bin/helm && 
chmod +x /usr/bin/helm && 
rm -rf linux-${ARCH}

我得到错误

------
> [ 5/13] RUN ARCHFLAG="$(uname -m)" && ARCH=$([ ARCHFLAG == "aarch64"] &&  echo "arm64" ||  echo $ARCHFLAG) && curl -sL "https://get.helm.sh/helm-v3.6.3-linux-${ARCH}.tar.gz" | tar -xvz &&     mv linux-${ARCH}/helm /usr/bin/helm &&     chmod +x /usr/bin/helm &&     rm -rf linux-${ARCH}:
#8 0.248 /bin/sh: 1: [: aarch64: unexpected operator
#8 1.295
#8 1.295 gzip: stdin: not in gzip format
#8 1.296 tar: Child returned status 1
#8 1.296 tar: Error is not recoverable: exiting now

我也将其作为字符串封装,在IDE中,第一个$ARCHFLAG显示为与其他字符串相同的颜色,而第二个$ARXCHFLAG显示为变量。

您正在使用[ $ARCHFLAG == "aarch64" ]。这将在bash或";半POSIX外壳";(例如,在POSIX模式下启动并实现==运算符的bash(,但在POSIX shell中,您会得到_意外运算符_。从您发布的错误消息中,我们可以看到您没有执行bash。我建议您要么切换到bash,要么将测试编写为[ "$ARCHFLAG" = "aarch64" ]

我没有aarch64和arm64然而,我在windows 上使用bash.exe尝试了您的脚本

#!/bin/bash
set -x
unset -f uname
uname ()
{
echo -n aarch64
}
HELM_VERSION=3.9.2
ARCHFLAG="$(uname -m)" && ARCH=$([ "$ARCHFLAG" == "aarch64" ] &&  echo "arm64" ||  echo $ARCHFLAG) && curl -sL "https://get.helm.sh/helm-v${HELM_VERSION}-linux-${ARCH}.tar.gz" | tar -xvz && 
echo mv linux-${ARCH}/helm /usr/bin/helm && 
echo chmod +x /usr/bin/helm && 
echo rm -rf linux-${ARCH}
set +x

样本输出:

$ ./73542210.sh
-bash 13 unset -f uname
-bash 13 HELM_VERSION=3.9.2
--bash 13 uname -m
--bash 13 echo -n aarch64
-bash 13 ARCHFLAG=aarch64
--bash 13 '[' aarch64 == aarch64 ']'
--bash 13 echo arm64
-bash 13 ARCH=arm64
-bash 13 curl -sL https://get.helm.sh/helm-v3.9.2-linux-arm64.tar.gz
-bash 13 tar -xvz
linux-arm64/
linux-arm64/helm
linux-arm64/LICENSE
linux-arm64/README.md
-bash 13 echo mv linux-arm64/helm /usr/bin/helm
mv linux-arm64/helm /usr/bin/helm
-bash 13 echo chmod +x /usr/bin/helm
chmod +x /usr/bin/helm
-bash 13 echo rm -rf linux-arm64
rm -rf linux-arm64
-bash 13 set +x
$ ls -ltr linux-arm64/helm
-rwxr-xr-x 1 murugesan openssl 45875200 Jul 21 23:11 linux-arm64/helm
$ ls -ltr linux-arm64
total 44816
-rwxr-xr-x 1 murugesan openssl 45875200 Jul 21 23:11 helm
-rw-r--r-- 1 murugesan openssl     3367 Jul 21 23:21 README.md
-rw-r--r-- 1 murugesan openssl    11373 Jul 21 23:21 LICENSE

我使用过使用echo的mv和rm命令。我使用了uname函数来测试您的脚本。在不使用set-x和set+x命令的情况下获得的输出。更新脚本:

$ rm -rf linux-arm64
$ ./73542210.sh
linux-arm64/
linux-arm64/helm
linux-arm64/LICENSE
linux-arm64/README.md
mv linux-arm64/helm /usr/bin/helm
chmod +x /usr/bin/helm
rm -rf linux-arm64
$ ./73542210.sh
ls -ltr linux-arm64
total 44816
-rwx---r-x+ 1 murugesan openssl 45875200 Jul 21 23:11 helm
-rw----r--+ 1 murugesan openssl     3367 Jul 21 23:21 README.md
-rw----r--+ 1 murugesan openssl    11373 Jul 21 23:21 LICENSE

相关内容

  • 没有找到相关文章

最新更新