GNU/Linux >> Linux の 問題 >  >> Linux

Shell =変数が#で始まるかどうかを確認します

解決策 1:

ハッシュをエスケープすれば、元のアプローチは問題なく機能します :

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

別のアプローチは、「部分文字列展開」を使用して、変数の内容の最初の文字を切り取ることです:

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

yep

Bash の man ページから:

   ${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.

解決策 2:

POSIX 互換バージョン:

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

または:

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

または:

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

解決策 3:

これは異端かもしれませんが、この種のことについては、シェル内から実行するよりも grep または egrep を使用したいと思います。もう少しコストがかかりますが(私は推測します)、私にとっては、このソリューションの読みやすさがそれを相殺します。もちろん、それは個人的な好みの問題です。

そう:

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

先行スペースの有無にかかわらず機能します。先頭のタブも考慮したい場合は、代わりに egrep -q '^[ \t]*#' を使用してください。


Linux
  1. bash の変数を持つエイリアス

  2. 引数が bash シェルで有効な日付かどうかを確認する

  3. sshを使用してリモートホストにファイルが存在するかどうかを確認します

  1. シェル スクリプト経由で echo コマンドを使用して mysql_secure_installation を自動化する

  2. シェルスクリプトとパイプの動作に関する明確化

  3. シェルスクリプトでユーザーのパスワードを確認する

  1. Zshの使用を開始する

  2. 関数とパラメータを変数として持つシェルスクリプト?

  3. シェル変数の割り当てにおける改行の自動変換?