
実は私は次のような宿題をしています。
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をエコーします。