I want to write a Unix shell script that will do various logic if there is a string inside of another string. For example, if I am in a certain folder, branch off. Could someone please tell me how to accomplish this? If possible I would like to make this not shell specific (i.e. not bash only) but if there's no other way I can make do with that.
#!/usr/bin/env sh
if [ "$PWD" contains "String1" ]
then
echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
echo "String2 present"
else
echo "Else"
fi
Pure POSIX shell:
#!/bin/sh
CURRENT_DIR=`pwd`
case "$CURRENT_DIR" in
*String1*) echo "String1 present" ;;
*String2*) echo "String2 present" ;;
*) echo "else" ;;
esac
Extended shells like ksh or bash have fancy matching mechanisms, but the old-style case
is surprisingly powerful.
If you want a ksh only method that is as fast as "test", you can do something like:
contains() # haystack needle
{
haystack=${1/$2/}
if [ ${#haystack} -ne ${#1} ] ; then
return 1
fi
return 0
}
It works by deleting the needle in the haystack and then comparing the string length of old and new haystacks.
#!/usr/bin/env sh
# Searches a subset string in a string:
# 1st arg:reference string
# 2nd arg:subset string to be matched
if echo "$1" | grep -q "$2"
then
echo "$2 is in $1"
else
echo "$2 is not in $1"
fi
case $(pwd) in
*path) echo "ends with path";;
path*) echo "starts with path";;
*path*) echo "contains path";;
*) echo "this is the default";;
esac
test $(echo "stringcontain" "ingcon" |awk '{ print index($1, $2) }') -gt 0 && echo "String 1 contain string 2"
--> output: String 1 contain string 2
There's Bash regular expressions. Or there's 'expr':
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
Here is a link to various solutions of your issue.
This is my favorite as it makes the most human readable sense:
The Star Wildcard Method
if [[ "$string" == *"$substring"* ]]; then
return 1
fi
return 0
In special cases where you want to find whether a word is contained in a long text, you can iterate through the long text with a loop.
found=F
query_word=this
long_string="many many words in this text"
for w in $long_string; do
if [ "$w" = "$query_word" ]; then
found=T
break
fi
done
This is pure Bourne shell.
Sadly, I am not aware of a way to do this in sh. However, using bash (starting in version 3.0.0, which is probably what you have), you can use the =~ operator like this:
#!/bin/bash
CURRENT_DIR=`pwd`
if [[ "$CURRENT_DIR" =~ "String1" ]]
then
echo "String1 present"
elif [[ "$CURRENT_DIR" =~ "String2" ]]
then
echo "String2 present"
else
echo "Else"
fi
As an added bonus (and/or a warning, if your strings have any funny characters in them), =~ accepts regexes as the right operand if you leave out the quotes.
See the manpage for the 'test' program. If you're just testing for the existence of a directory you would normally do something like so:
if test -d "String1"; then
echo "String1 present"
end
If you're actually trying to match a string you can use bash expansion rules & wildcards as well:
if test -d "String*"; then
echo "A directory starting with 'String' is present"
end
If you need to do something more complex you'll need to use another program like expr.
Source: Stackoverflow.com