我正在编写一个bash脚本,它接收<task>
ID字符串作为参数,然后执行指定的任务。在执行结束时,它必须显示总执行时间。代码必须灵活,并且易于添加新的条件。
用法:build.sh <task><task><task>...
任务ID有点棘手:
- 如果只是一个字符[a-z],则表示给定任务的所有子任务
- 如果是一个字符+数字,则仅表示特定的子任务
让我给你一些例子:
build.sh a1a2
: 执行任务a1
和a2
,但不包括a3
build.sh a
: 执行所有以字符a
开头的任务(a
的所有子任务)build.sh a1b
: 仅运行任务a1
和所有子任务b
build.sh a1b3
: 仅运行任务a1
和b3
build.sh ab
: 运行所有子任务a
和b
build.sh *
: 运行构建脚本中定义的所有任务(所有子任务),如a
+b
+c
任务的执行顺序是预定的,因此实际上 b1a1
将执行 a1b1
。
这是我的 bash 脚本:
#!/bin/bash -ue
# show help
function show_help() {
if [ "$1" -eq 0 ]; then
printf "..."
exit 0
fi
}
# does the build
function build {
local title dir
title="$1"
dir="$2"
printf "\n%b> building '%s'...%b\n" "$COLOR_YELLOW" "$title" "$COLOR_DEFAULT"
cd "$WORKSPACE/../$dir"
./build.sh
cd "$WORKSPACE"
}
# group A build
function build_group_a {
if [[ "$1" == *a1* ]]; then build "task A.1" "base/xxx"; fi
if [[ "$1" == *a2* ]]; then build "task A.2" "base/yyy"; fi
if [[ "$1" =~ $(getRegexp a) ]]; then
build "task A.1" "base/xxx"
build "task A.2" "base/yyy"
fi
}
# group B build
function build_group_b {
# same with 'build_group_a' only conditions are different
}
# REGEXP THAT DOES NOT WORK PROPERLY
function getRegexp() {
printf ".*%s[a-z].*" "$1"
}
show_help "$#"
START_TIME=$(date +%s)
# 'all' works but '*' not
if [[ "$1" == all ]]; then
build_group_a a
build_group_b b
else
build_group_a "$1"
build_group_b "$2"
fi
ELAPSED=$(($(date +%s) - START_TIME))
printf "build time: %s\n" "$(date -d@$ELAPSED -u +%H\ hour\ %M\ day\ %S\ sec)"
一切都正常工作,任务按顺序执行,但如果我使用build.sh a
,则什么也不会执行。如果我使用build.sh ab
,则只有任务a
被执行。我不知道为什么。似乎我的正则表达式没有处理最后一个任务ID。
另一个问题是,如果我说build.sh aa1
,那么所有a
的任务都会被执行,但是任务a1
会被执行两次。当调用a
时,任务a1
只能执行一次。
如果您可以指导我如何在正则表达式中解决这个问题,那将非常好。
a
失败是因为.*a[a-z].*
的最小长度为2。ab
与.*b[a-z].*
不匹配,所以b
无法运行。 - jhnca
和a1
/a2
。 - jhnc%s([^0-9]|$)
。 - jhnc