Shell = Check if variable begins with #

Solution 1:

Your original approach would work just fine if you escaped the hash:

$ [[ '#snort' == \#* ]]; echo $?

Another approach would be slicing off the first character of the variable's content, using "Substring Expansion":

if [[ ${x:0:1} == '#' ]]
    echo 'yep'
    echo 'nope'


From the Bash man page:

          Substring  Expansion.   Expands  to  up  to length characters of
          parameter starting at the character  specified  by  offset.   If
          length  is omitted, expands to the substring of parameter start-
          ing at the character specified by offset.  length and offset are
          arithmetic   expressions   (see  ARITHMETIC  EVALUATION  below).
          length must evaluate to a number greater than or equal to  zero.
          If  offset  evaluates  to  a number less than zero, the value is
          used as an offset from the end of the value  of  parameter.   If
          parameter  is  @,  the  result  is  length positional parameters
          beginning at offset.  If parameter is an array name indexed by @
          or  *,  the  result is the length members of the array beginning
          with ${parameter[offset]}.  A negative offset is taken  relative
          to  one  greater  than the maximum index of the specified array.
          Note that a negative offset must be separated from the colon  by
          at  least  one  space to avoid being confused with the :- expan-
          sion.  Substring indexing is zero-based  unless  the  positional
          parameters are used, in which case the indexing starts at 1.

Solution 2:

POSIX-compatible version:

[ "${var%${var#?}}"x = '#x' ] && echo yes


[ "${var#\#}"x != "${var}x" ] && echo yes


case "$var" in
    \#*) echo yes ;;
    *) echo no ;;

Solution 3:

I know this may be heresy, but for this kind of things I'd rather use grep or egrep rather than doing it from within the shell. It's a little more costly (I guess) but for me this solution's readability offsets that. It's a matter of personal taste though, of course.


myvar="   #comment asfasfasdf"
if ! echo $myvar | egrep -q '^ *#'
  echo "not a comment"
  echo "commented out"

It works with or without leading spaces. If you'd like to account for leading tabs also, use egrep -q '^[ \t]*#' instead.