Suppose I have the following code in bash:
#!/bin/bash
bad_fruit=( apple banana kiwi )
for fname in `ls`
do
# want to check if fname contains one of the bad_fruit
is_bad_fruit=??? # <------- fix this line
if [ is_bad_fruit ]
then
echo "$fname contains bad fruit in its name"
else
echo "$fname is ok"
fi
done
How do I fix is_bad_fruit so that it is true if fname contains one of the bad_fruit strings?
$() means: "first evaluate this, and then evaluate the rest of the line". Ex : echo $(pwd)/myFile.txt. will be interpreted as echo /my/path/myFile.txt. On the other hand ${} expands a variable.
$_ (dollar underscore) is another special bash parameter and used to reference the absolute file name of the shell or bash script which is being executed as specified in the argument list. This bash parameter is also used to hold the name of mail file while checking emails.
The =~ operator is a regular expression match operator. This operator is inspired by Perl's use of the same operator for regular expression matching.
Another option (using grep
with an inner loop and evaluating the exit code):
#!/bin/bash
bad_fruit=( apple banana kiwi )
for fname in *; do
for fruit in "${bad_fruit[@]}"; do
echo "$fruit"
done | grep "$fname"
if [ $? -eq 0 ]; then
echo "$fname contains bad fruit in its name"
else
echo "$fname is ok"
fi
done
Try the following code :
#!/bin/bash
bad_fruit=( apple banana kiwi )
re="$(printf '%s\n' "${bad_fruit[@]}" | paste -sd '|')"
for fname in *; do
# want to check if fname contains one of the bad_fruit
if [[ $fname =~ $re ]]; then
echo "$fname contains bad fruit in its name"
else
echo "$fname is ok"
fi
done
Take care of useless use of ls
ls
is a tool for interactively looking at file information. Its output is formatted for humans and will cause bugs in scripts. Use globs or find instead. Understand why : http://mywiki.wooledge.org/ParsingLs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With