GNU/Linux >> Linux Esercitazione >  >> Linux

Shell =Controlla se la variabile inizia con #

Soluzione 1:

Il tuo approccio originale funzionerebbe perfettamente se evitassi l'hash :

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

Un altro approccio sarebbe tagliare via il primo carattere del contenuto della variabile, usando "Substring Expansion":

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

yep

Dalla pagina man di Bash:

   ${parameter:offset}
   ${parameter:offset:length}
          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.

Soluzione 2:

Versione compatibile con POSIX:

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

oppure:

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

oppure:

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

Soluzione 3:

So che questa potrebbe essere un'eresia, ma per questo genere di cose preferirei usare grep o egrep piuttosto che farlo dall'interno della shell. È un po 'più costoso (immagino) ma per me la leggibilità di questa soluzione lo compensa. Ovviamente è una questione di gusti personali.

Quindi:

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

Funziona con o senza spazi iniziali. Se desideri tenere conto anche delle tabulazioni iniziali, utilizza invece egrep -q '^[ \t]*#'.


Linux
  1. Legge i valori in una variabile di shell da una pipe

  2. Alias ​​con variabile in bash

  3. controlla se il file esiste sull'host remoto con ssh

  4. Directory di modifica dello script Shell con variabile

  5. Aggiungi una riga al file /etc/hosts con lo script della shell

Comando Echo in Linux (con esempi)

Echo Command in Linux con esempi

Controlla la connettività del database utilizzando lo script Shell

Controlla se esiste una variabile in un elenco in Bash

controlla se l'argomento è una data valida nella shell bash

Automatizza mysql_secure_installation con il comando echo tramite uno script di shell