linuxbashscriptingenvironment-variables

How to store --exclude arguments for grep in an environment variable in a bash script


My goal is to search a file-hierarchy for certain text patterns, excluding certain file-name patterns, and recursively copy just the matching files to a local directory named confs. The following script does the job:

#!/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;
}

However, the exclusion patterns are likely to need frequent updates and may need to be shared with other functions, so I prefer to have them all in a variables declared at the beginning of the script. When I do the following, files that should be excluded get copied to the confs directory:

#!/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;
}

Any idea how to obtain the desired behavior? Or how to see what grep sees when it gets passed the $FEXCLUDE argument (echo doesn't show anything wrong)?

Thanks.


Solution

  • I know this will raise frowns but this can be solved by using eval and it might not come with usual risks as we're using pattern in --exclude= argument.

    #!/bin/bash
    
    fexclude='{*edit,*debug,*orig,*BAK,*bak,*fcs,*NOPE,*tomcat,*full.xml,*-ha.xml}'
    dexclude='{log,tmp,i2b2.war,*.log,*_history,*.old}'
    srcdir=/opt/jboss-as-7.1.1.Final/standalone
    
    confshow() {
      eval grep -rlZ \
        --exclude="$fexclude" \
        --exclude-dir="$dexclude" \
        "<datasource\|username\|password\|user-name" \
        $srcdir/* | xargs -0 -I {} cp --parents '{}' confs
      done
    }