In a shell script, how can I find out if a string is contained within another string. In bash, I would just use =~, but I am not sure how I can do the same in /bin/sh. Is it possible?
3 Answers
You can use a case statement:
case "$myvar" in
*string*) echo yes ;;
* ) echo no ;;
esac
All you have to do is substitute string for whatever you need.
For example:
case "HELLOHELLOHELLO" in
*HELLO* ) echo "Greetings!" ;;
esac
Or, to put it another way:
string="HELLOHELLOHELLO"
word="HELLO"
case "$string" in
*$word*) echo "Match!" ;;
* ) echo "No match" ;;
esac
Of course, you must be aware that $word should not contain magic glob characters unless you intend glob matching.
4 Comments
user2492861
I tried this but it didn't work #!/bin/sh myvar="HELLO" myothervar="HELLOHELLOHELLO" case "$myvar" in $myothervar) echo yes ;; * ) echo no ;; esac
ams
The stars,
*, either side are significant and must be there.ams
Contrary to my previous comment (now deleted), it does do variable expansion. It's the missing stars that are the problem.
ams
Also, you have
myvar and myothervar backwards.You can define a function
matches() {
input="$1"
pattern="$2"
echo "$input" | grep -q "$pattern"
}
to get regular expression matching. Note: usage is
if matches input pattern; then
(without the [ ]).
You can try lookup 'his' in 'This is a test'
TEST="This is a test"
if [ "$TEST" != "${TEST/his/}" ]
then
echo "$TEST"
fi
3 Comments
user3840020
TEST="This is a test"; if [ "$TEST" != ${TEST/his/} ]; then; echo $TEST; fi
user2492861
I get [: is: unexpected operator/operand
Jose Velasco
@user3840020 TEST="This is a test"; if [ "$TEST" != ${TEST/his/} ]; then echo $TEST; f