linux - 如何在 bash 脚本的环境变量中存储 grep 的 --exclude 参数

标签 linux bash scripting environment-variables

我的目标是在文件层次结构中搜索某些文本模式(排除某些文件名模式),然后递归地将匹配的文件复制到名为 confs 的本地目录。以下脚本完成这项工作:

#!/bin/bash
export FEXCLUDE="{*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml}";
export SRCDIR=/opt/jboss-as-7.1.1.Final/standalone;

confshow() {
  for ii in `grep -rlZ \
  --exclude={*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml} \
  --exclude-dir={log,tmp,i2b2.war,*.log,*_history,*.old} "<datasource\|username\|password\|user-name" \
  $SRCDIR/*  | xargs -0 ls {}` ; 
    do cp --parents $ii confs; 
  done;
}

但是,排除模式可能需要频繁更新,并且可能需要与其他函数共享,因此我更喜欢将它们全部放在脚本开头声明的变量中。当我执行以下操作时,应排除的文件将被复制到 confs 目录:

#!/bin/bash
export FEXCLUDE="{*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml}";
export SRCDIR=/opt/jboss-as-7.1.1.Final/standalone;

confshow() {
  for ii in `grep -rlZ \
  --exclude=$FEXCLUDE \
  --exclude-dir={log,tmp,i2b2.war,*.log,*_history,*.old} "<datasource\|username\|password\|user-name" \
  $SRCDIR/*  | xargs -0 ls {}` ; 
    do cp --parents $ii confs; 
  done;
}

知道如何获得所需的行为吗?或者如何查看 grep 在传递 $FEXCLUDE 参数时看到的内容(echo 没有显示任何错误)?

谢谢。

最佳答案

大括号扩展非常适合交互式使用,但如果您正在编写脚本,只需使用编辑器快速复制必要的 --exclude 选项并将它们存储在数组中。您可能已经注意到,参数扩展不会进行大括号扩展。

#!/bin/bash
# You didn't need to export these anyway, since only your script uses them
FEXCLUDE=( --exclude '*edit'
           --exclude '*debug'
           # etc
)
DEXCLUDE=( --exclude-dir log
           --exclude-dir tmp
           # etc
)
SRCDIR=/opt/jboss-as-7.1.1.Final/standalone

confshow() {
while IFS= read -d'' -r ii; do
    cp --parents "$ii" confs
done < <( grep -rlZ "${FEXCLUDE[@]}" "${DEXCLUDE[@]}" "<datasource\|username\|password\|user-name" $SRCDIR/* )

此外,使用 ls 就违背了使用 grep 的空分隔输出的目的。

关于linux - 如何在 bash 脚本的环境变量中存储 grep 的 --exclude 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38335552/

相关文章:

python - Python 的 subprocess.call() 和 Bash 流在语义上是否不同?

linux - 从右边提取两个/之间的字符串

linux - bash/awk 脚本比较两个不同文件夹中所有文件的内容

python - 新的 python virtualenv 应该用新的 linux 用户帐户创建吗?

java - 以编程方式将 cron 作业写入 crontab 文件无法运行

linux - Graphite 服务器高 IO 等待时间

linux - 当密码包含反引号时 bash 脚本失败

linux - 测试ip能ping通,但是只有一个loop就结束了。

linux - Bash 中 ${} 和 $() 的区别

bash - 如何查找字符串并将其替换为引号?