如何在Bash CLI中将多个命令合并成单个for命令?

3

要删除卷,首先需要将其脱机,然后再删除。以下是执行此操作的命令。

for i in {1..16}; do  vol --offline StressIO-v$i --force || break; done
for i in {1..16}; do  vol --delete StressIO-v$i || break; done

如何将这些命令结合起来并作为单个命令执行?

1
那个命令看起来不太合理 - 你确定它是正确的吗?如果 vol3 没有成功离线,它会停止并且不会将 vols 4-16 置为离线,但是它仍然会继续并删除所有 16 个卷。所以我必须问自己,避免将vols 4-16设置为离线只是因为独立的vol3没有离线的意义是什么? - Mark Setchell
3个回答

5
您可以使用GNU Parallel并行地执行所有16个操作,遇到第一个错误就停止,像这样:

parallel --halt now,fail=1 -k --dry-run 'vol --offline StressIO-v{} --force && vol --delete StressIO-v{}' ::: {1..16}

样例输出

vol --offline StressIO-v1 --force && vol --delete StressIO-v1
vol --offline StressIO-v2 --force && vol --delete StressIO-v2
vol --offline StressIO-v3 --force && vol --delete StressIO-v3
vol --offline StressIO-v4 --force && vol --delete StressIO-v4
vol --offline StressIO-v5 --force && vol --delete StressIO-v5
vol --offline StressIO-v6 --force && vol --delete StressIO-v6
vol --offline StressIO-v7 --force && vol --delete StressIO-v7
vol --offline StressIO-v8 --force && vol --delete StressIO-v8
vol --offline StressIO-v9 --force && vol --delete StressIO-v9
vol --offline StressIO-v10 --force && vol --delete StressIO-v10
vol --offline StressIO-v11 --force && vol --delete StressIO-v11
vol --offline StressIO-v12 --force && vol --delete StressIO-v12
vol --offline StressIO-v13 --force && vol --delete StressIO-v13
vol --offline StressIO-v14 --force && vol --delete StressIO-v14
vol --offline StressIO-v15 --force && vol --delete StressIO-v15
vol --offline StressIO-v16 --force && vol --delete StressIO-v16

如果您喜欢它的外观,请移除 --dry-run 并再次运行以实际运行。

如果您不担心失败停止或执行顺序,可以将其简化为:

parallel 'vol --offline StressIO-v{} --force && vol --delete StressIO-v{}' ::: {1..16}

3
您可以在单个循环中检查第一个“offline”评论的退出状态,并执行“delete”。
for i in {1..16}; do
    vol --offline StressIO-v$i --force && vol --delete StressIO-v$i || break
done

1

在这两个命令之间加上 &&。这将同时执行这两个命令。

否则,创建一个脚本文件如下: vi example.sh

并将以下行粘贴到脚本文件中:

#!/bin/bash
for i in {1..16}; do  vol --offline StressIO-v$i --force || break; done
for i in {1..16}; do  vol --delete StressIO-v$i || break; done

按ESC+ wq保存此文件!

然后将其设为可执行文件。

chmod +x example.sh

将此脚本作为以下方式运行:

./example.sh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接