有条件的命令在bash中的管道命令序列中执行
问题描述:
对于颠簸的主题名称感到抱歉(如果在查看问题后发现更合适的标题,请随时编辑)。 代码示例等于1000分的话,那么在这里我们去:有条件的命令在bash中的管道命令序列中执行
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 $正则表达式”或不。我认为条件化别名可以像我习惯使用shell一样完成这项工作,但它们在脚本中不起作用。
我可以放入一个条件,但我担心来自多个评估的性能影响。
任何方式来使代码“更优雅”?
答
一个简单的方法是使用^
(始终一致:它的意思是“开始的行”,其中每行都有),如果$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"' \;
答
一个很简单的解决办法是:
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 ...
完全一样的效果。
答
这是一个稍微难看,但一般的解决方案。
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
你能描述一下你想要的输入/输出好一点吗? – 2012-03-23 20:30:25
@CarlNorum不要认为这是必要的,但我应该:首先找到匹配名称'{status,stderr,stdout)-captured'的文件的打印路径,然后这些进一步被'grep -E $ REGEX'过滤。 awk,sed和read,组装这个例子: './dir/status-captured'到执行的'mv ./dir/status-captured。/ dir/status-expected'中。 – AoeAoe 2012-03-23 20:36:11