
実際、私は次のような課題に取り組んでいます:
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
有効な変数名はbash
1 つ以上の 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 がエコーされます。