抱歉崎岖的主题名称(如果您在查看问题后找到更合适的标题,请随时编辑)。 代码示例等于1000个单词,所以我们在这里:
if [ "$REGEX" != "" ]; then
find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |
grep -E $REGEX |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done
else
find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done
fi
什么代码并不是那么重要,我只想找到更优雅的方式来使用“ grep -E $ REGEX ”或不使用。我认为conditdonal别名可以完成这项工作,就像我习惯使用shell一样,但它们在脚本中不起作用。
我可能会陷入困境,但我担心多次评估会对绩效产生影响。
任何使代码“更优雅”的方法?
答案 0 :(得分:1)
一个非常简单的解决方案是:
test -n "$REGEX" && cmd="grep -E $REGEX"
find ... | ${cmd-cat} | awk ...
如果定义了cmd,则在管道中使用它。否则,使用cat,执行no-op。 你也可以这样做:
find ... |
if test -n "$REGEX"; then
grep -E $REGEX
else
cat
fi |
awk ...
具有完全相同的效果。
答案 1 :(得分:1)
一种简单的方法是使用^
(它始终匹配:它表示“行首”,如果$REGEX
未设置或空白,则表示每行都有:
find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' |
grep -E ${REGEX:-^} |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done
就此而言,您可以将其合并到原始find
:
find $TEST_DIR -type f -regextype posix-extended \
-regex '^.*(status|stderr|stdout)-captured$' \
-regex ".*${REGEX}.*" |
awk '{print(""$1" "$1)}' | sed 's/-captured$/-expected/' |
while read -r line; do mv -f $line; done
就此而言,您可以将所有其余脚本合并到find
中:
find $TEST_DIR -type f -regextype posix-extended \
-regex '^.*(status|stderr|stdout)-captured$' \
-regex ".*${REGEX}.*" \
-exec bash -c 'file="{}" ; mv -f "$file" "${file%-captured}-expected"' \;
答案 2 :(得分:0)
这是一个稍微丑陋但一般的解决方案。
find $TEST_DIR -type f -regextype posix-extended -regex '^.*(status|stderr|stdout)-captured$' \
| if [ "$REGEX" != "" ]; then
grep -E $REGEX; \
else \
cat; \
fi \
| awk '{print(""$1" "$1)}' \
| sed 's/-captured$/-expected/' \
| while read -r line; do mv -f $line; done