如何提取命令结果字符串并在循环中使用它

How to extract string of command result and use it in a loop

运行 nx affected:apps 命令给我这个输出:

>  NX   NOTE  Affected criteria defaulted to --base=master --head=HEAD


>  NX  Affected apps:

  - app-backend
  - app-frontend
  - app-something
  - app-anything

我需要获取所有应用程序名称并再次使用它们进行命令调用。

所以我从那个开始

output=$(nx affected:apps)  
echo "$output" | grep -E "^\W+app-(\w+)"

这给了我

- app-backend
- app-frontend
- app-something
- app-anything

但我只需要获取名称而不是 运行 foo --name={appname} 四次。 也不太确定如何在循环中使用它。 bash 脚本的新手:-(

我这里没有 nx 命令,但你可以尝试使用 xargs:

nx affected:apps | grep '^  -' | cut -d' ' -f4 | xargs  -I{}  echo docker build -t {} ./dist/{}

删除 echo 以实际 运行 命令。

您可以在 gnu-grep:

中将 -o(仅显示匹配项)与 -P(perl regex moode)一起使用
nx affected:apps |
grep -oP "^\W+app-\K\w+" |
xargs -I {} docker build -t {} .

如果 gnu-grep 不可用,则使用此 awk 命令:

nx affected:apps |
awk -F- '/app-/{print }' |
xargs -I {} docker build -t {} .

您可以使用 --plain 选项:

nx affected:apps --plain

该命令应 return 所有受影响的应用程序,并以 space 作为分隔符。然后,您可以将它们存储到 bash 数组并在 for 循环中循环遍历它们,运行 您需要的命令:

#!/bin/bash
AFFECTED=($(./node_modules/.bin/nx affected:apps --plain))

for t in ${AFFECTED[@]}; do
    echo $t
done