'grep' コマンドを使用して引数から値を取得するにはどうすればよいでしょうか?

'grep' コマンドを使用して引数から値を取得するにはどうすればよいでしょうか?

実際、私は次のような課題に取り組んでいます:

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

私がやっていることは、'grep'コマンドを使用して[0-9]*などの正規表現を含む値を見つけることです。しかし、'grep'コマンドは基本的にファイル内のいくつかの行をキャプチャするものなので、入力した引数からその表現を含む値を取得する方法がわかりません。どんな助けでも本当にありがたいです

答え1

これはgrepを使用していませんが、参考までに、bashの=~条件演算子を使用して、スクリプトの最初の引数をaの正規表現クラスと比較することができますname。これは、Bash リファレンスマニュアルとして:

文字、数字、アンダースコアのみで構成され、文字またはアンダースコアで始まる単語。名前はシェル変数名や関数名として使用されます。

$ 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

有効な変数名はbash1 つ以上の 1 バイト文字で構成され、最初の文字はアルファベットまたはアンダースコア、残りの文字はアルファベット、0123456789、またはアンダースコア(ある場合)になります。

たとえば、 は、が 0xE9 バイトである ISO-8859-1 のような単一バイトであるStéphaneロケールでのみ有効な変数名であり、 0xC3 0xA9 としてエンコードされる UTF-8 では有効ではありません。é

次のようなことができます:

#! /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」と答えます。これは正規表現ではなくシェルのグロブ パターンを使用しており、 だけでなく任意の POSIX シェルで実行されることに注意してください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 がエコーされます。

関連情報