Check whether string starts with "!" in POSIX sh

You can use the standard POSIX parameter substitution syntax.

${var#repl} will remove the repl from the beginning of the content of the $var variable.

So, you'll have:

$ var=test
$ echo ${var#t}
est
$ echo ${var#X}
test

So, in order to have a simple if statement to check if a variable starts with a string (! in your case), you can have:

#!/bin/sh

if test "$line" = "${line#!}"; then
    echo "$0: $line has no !"
else
    echo "$0: $line has !"
fi

PS: test ... is equivalent to [ ... ], so the above script is exactly the same as

#!/bin/sh

if [ "$line" = "${line#!}" ]; then
    echo "$0: $line has no !"
else
    echo "$0: $line has !"
fi

In POSIX test, = performs exact string comparisons only.

Use a case statement instead.

case $line in
  "!"*) echo "$line starts with an exclamation mark" ;;
  *)    echo "$line does not start with an exclamation mark" ;;
esac

If you really want to put this in an if, you can do that:

if case $string in "!"*) true;; *) false;; esac; then
  echo "$line starts with an exclamation mark"
else
  echo "$line does not start with an exclamation mark"
fi

Tags:

Sh