Search code examples
bashif-statementpattern-matchingstring-matching

bash script to check file name begins with expected string


Running on OS X with a bash script:

sourceFile=`basename $1`
shopt -s nocasematch
if [[ "$sourceFile" =~ "adUsers.txt" ]]; then echo success ; else echo fail ; fi

The above works, but what if the user sources a file called adUsers_new.txt?

I tried:

if [[ "$sourceFile" =~ "adUsers*.txt" ]]; then echo success ; else echo fail ; fi

But the wildcard doesn't work in this case. I'm writing this script to allow for the user to have different iterations of the source file name, which must begin with aduser and have the .txt file extension.


Solution

  • In bash, you can get the first seven characters of a shell variable with:

    ${sourceFile:0:7}
    

    and the last four with:

    ${sourceFile:${#sourceFile}-4}
    

    Armed with that knowledge, simply use those expressions where you would normally use the variable itself, something like the following script:

    arg=$1
    shopt -s nocasematch
    i7f4="${arg:0:7}${arg:${#arg}-4}"
    if [[ "${i7f4}" = "adusers.txt" ]] ; then
        echo Okay
    else
        echo Bad
    fi
    

    You can see it in action with the following transcript:

    pax> check.sh hello
    Bad
    
    pax> check.sh addUsers.txt
    Bad
    
    pax> check.sh adUsers.txt
    Okay
    
    pax> check.sh adUsers_new.txt
    Okay
    
    pax> check.sh aDuSeRs_stragngeCase.pdf.gx..txt
    Okay