4

在 Azure DevOps 中创建这样的内联 bash 命令时:

checksum="$(cksum file.txt)"

我最终将cksum file.txt其视为必需参数。无论出于何种原因,这种行为并不一致,所以有时我设置了可以与内联 Bash 脚本一起正常工作的构建管道,但不可避免地,我会遇到这个问题并且无法修复它。

我什至尝试将cksum file.txt参数设置为cksum file.txt,但用编码字符串替换空格:%20。它变成cksum%20file.txt了这不是 bash 中的有效命令。

这是完整的脚本:

yarnCacheFilename="$(cksum yarn.lock).yarnCache.docker.tgz"

wget "https://example.azureedge.net/yarn-cache/$yarnCacheFilename"

if [ -f "$yarnCacheFilename" ]; then
    mkdir node_modules
    tar -xzvf "$yarnCacheFilename"
else
    yarn install --production
fi

很简单。那是我可以在任何bash终端上运行的代码。遗憾的是,Azure DevOps 正在向任务组添加一个参数:

Azure DevOps 为内联 <code>bash</code> 命令添加参数

此参数存在的事实意味着 Azure DevOps 正在阻止我的 bash 文件正确执行并替换最关键的部分。

我该如何解决这个问题?

4

2 回答 2

7

您可以使用命令替换,因此将 $() 替换为两边的反引号 `。

https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html有关命令替换的更多信息。

checksum="`cksum file.txt`"

完整脚本示例

yarnCacheFilename="`cksum yarn.lock`.yarnCache.docker.tgz"

wget "https://example.azureedge.net/yarn-cache/$yarnCacheFilename"

if [ -f "$yarnCacheFilename" ]; then
    mkdir node_modules
    tar -xzvf "$yarnCacheFilename"
else
    yarn install --production
fi
于 2019-03-21T10:04:09.860 回答
1

如果您的意思是您想将字符串“ cksum file.txt”作为参数传递给内联 bash 脚本,那么您可以设置一个变量并在后续任务/脚本中使用该变量。

例如:

  1. 设置checksum变量:

    echo "##vso[task.setvariable variable=checksum]cksum file.txt"
    
  2. 读取变量

    echo "No problem reading $CHECKSUM"
    

有关详细信息,请参阅在脚本中定义和修改变量

如果您运行使用类似路径指定的脚本$/project/script/Test0427/bash.sh,则可以直接将字符串作为参数传递:

  1. 论据:

    " cksum file.txt" " Test Arguments 1018"

  2. 读取变量

    echo "No problem reading $1 and $2"
    

在此处输入图像描述

于 2018-10-18T07:22:56.617 回答