Matt S
Matt S

Reputation: 1882

In bash, how can I check a string for partials in an array?

If I have a string:

s='path/to/my/foo.txt'

and an array

declare -a include_files=('foo.txt' 'bar.txt');

how can I check the string for matches in my array efficiently?

Upvotes: 2

Views: 116

Answers (2)

iruvar
iruvar

Reputation: 23364

You could loop through the array and use a bash substring check

for file in "${include_files[@]}"
do 
   if [[ $s = *${file} ]]; then
     printf "%s\n" "$file"
   fi
done

Alternately, if you want to avoid the loop and you only care that a file name matches or not, you could use the @ form of bash extended globbing. The following example assumes that array file names do not contain |.

shopt -s extglob
declare -a include_files=('foo.txt' 'bar.txt');
s='path/to/my/foo.txt'
printf  -v pat "%s|" "${include_files[@]}"
pat="${pat%|}"
printf "%s\n" "${pat}"
#prints foo.txt|bar.txt
if [[ ${s##*/} = @(${pat}) ]]; then echo yes; fi

Upvotes: 3

iamauser
iamauser

Reputation: 11469

For an exact match to the file name:

#!/bin/bash

s="path/to/my/foo.txt";
ARR=('foo.txt' 'bar.txt');
for str in "${ARR[@]}"; 
do 
  # if [ $(echo "$s" | awk -F"/" '{print $NF}') == "$str" ]; then
  if [ $(basename "$s") == "$str" ]; then  # A better option than awk for sure...
     echo "match"; 
  else 
     echo "no match"; 
  fi; 
done

Upvotes: 0

Related Questions