"grep"コマンドを使用してパラメータからいくつかの値を取得するには?

"grep"コマンドを使用してパラメータからいくつかの値を取得するには?

実は私は次のような宿題をしています。

1:引数が有効なシェル変数名の場合は「yes」を印刷し、それ以外の場合は「no」を印刷するvalidというプログラムを作成します。

私がやっていることは、 "grep"コマンドを使用して[0-9] *のような正規表現を含むいくつかの値を探したいことです。しかし、 "grep"コマンドはデフォルトでファイルの特定の行をキャプチャするので、その式を含む私が入力したパラメータからいくつかの値を取得する方法がわかりません。どんな助けでも大変感謝します。

答え1

これはgrepを使用しませんが、参照のためにbashの=~条件付き演算子を使用してスクリプトの最初の引数を正規表現クラスと比較できますnameバッシュリファレンスマニュアルように:

文字、数字、下線のみで構成され、文字または下線で始まる単語です。名前はシェル変数と関数名として使用されます。

$ cat isvarname
#!/bin/bash
if [ "$#" -ne 1 ]
then
   echo "Usage: $0 a-string"
   exit 1
fi

if [[ "$1" =~ ^[[:alpha:]_][[:alnum:]_]*$ ]]
then
  echo yes
else
  echo no
fi

答え2

有効なbash変数名は、1 つ以上のシングルバイト文字で構成されます。最初の文字は文字または下線で、残りの文字(存在する場合)は文字、0123456789、または下線です。

たとえば、Stéphane変数名はロケール内でのみ有効です。éISO-8859-1ではシングルバイトで0xE9バイトですが、UTF-8では0xC3 0xA9でエンコードされます。

次のことができます。

#! /usr/bin/env bash
is_single_byte() {
  local length_in_bytes length_in_chars
  length_in_chars=${#1}
  local LC_ALL=C
  length_in_bytes=${#1}
  ((length_in_bytes == length_in_chars))
}

re='^[[:alpha:]_][[:alnum:]_]*$'
for var do
  if is_single_byte "$var" && [[ $var =~ $re ]]; then
    printf '"%s" is a valid variable name\n' "$var"
  else
    printf '"%s" is not a valid variable name\n' "$var"
  fi
done

答え3

最初のコマンドライン引数はとして使用できます$1。有効なシェル変数名はアルファベット文字(またはアンダースコア)で始まり、英数字(またはアンダースコア)で続きます。

2つの一致するシェルパターン無効シェル変数名は次のとおりです。

[!a-zA-Z_]*

そして

[a-zA-Z_]*[!a-zA-Z_0-9]*

case ... esacこれを使用して、変数の値をパターン一致させることができます。

スポイラー警告:

#!/bin/sh
LC_ALL=C
ケース '$1'
    [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"")
        エコ「いいえ」
        ;;;
    *)
        エコ「はい」
イサク
名前が空の変数についても「NO」と答えます。これは正規表現ではなくシェルグローブパターンを使用しますbash

テスト:

$ ./script.sh _ae
YES
$ ./script.sh 0a9oe
NO
$ ./script.sh aoeat
YES
$ ./script.sh aoeat-aoe
NO

答え4

#!/bin/bash
var=$1
if [[ $var =~ [\`\$\=\/] || $var =~ \[ ]]; then
    echo 'no'
    exit
fi
declare "$var"=test 2>/dev/null
if [[ ${!var} == 'test' || $1 == 'var' ]]; then
    echo 'yes'
else
    echo 'no'
fi

testこれにより、指定された値に値を割り当てようとします。成功した場合(値が有効な変数名の場合)、ifテストと一致し、yesをエコーし​​、そうでない場合はnoをエコーし​​ます。

関連情報