
Eigentlich erledige ich einige Aufgaben wie folgt:
1: Schreiben Sie ein Programm namens valid, das „yes“ ausgibt, wenn sein Argument ein gültiger Shell-Variablenname ist, und andernfalls „no“:
Ich möchte einen Wert finden, der einen regulären Ausdruck enthält, z. B. [0-9]*, indem ich den Befehl „grep“ verwende. Aber ich habe keine Ahnung, wie ich einen Wert mit diesem Ausdruck aus dem von mir eingegebenen Argument herausholen kann, da der Befehl „grep“ im Grunde dazu dient, eine Zeile in der Datei zu erfassen. Für jede Hilfe wäre ich sehr dankbar.
Antwort1
Dabei wird grep nicht verwendet, aber als Referenzpunkt können Sie den =~
Bedingungsoperator von bash verwenden, um das erste Argument des Skripts mit der regulären Ausdrucksklasse für a zu vergleichen name
, die durch denBash-Referenzhandbuchals:
Ein Wort, das ausschließlich aus Buchstaben, Zahlen und Unterstrichen besteht und mit einem Buchstaben oder Unterstrich beginnt. Namen werden als Shell-Variablen- und Funktionsnamen verwendet.
$ 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
Antwort2
Ein bash
gültiger Variablenname besteht aus einem oder mehreren Einzelbyte-Zeichen, wobei das erste ein Buchstabe oder ein Unterstrich ist und alle übrigen, falls vorhanden, Buchstaben, 0123456789 oder ein Unterstrich sind.
Beispielsweise Stéphane
ist dies nur in Gebietsschemas ein gültiger Variablenname, in denen é
es sich um ein Einzelbyte handelt, wie in ISO-8859-1, wo es sich um das 0xE9-Byte handelt, nicht in UTF-8, wo es als 0xC3 0xA9 codiert ist.
Sie könnten beispielsweise Folgendes tun:
#! /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
Antwort3
Das erste Befehlszeilenargument ist verfügbar als $1
. Ein gültiger Shellvariablenname beginnt mit einem alphabetischen Zeichen (oder Unterstrich) und wird mit alphanumerischen Zeichen (oder Unterstrichen) fortgesetzt.
Zwei Schalenmuster, die zu einemungültigShell-Variablenname ist
[!a-zA-Z_]*
Und
[a-zA-Z_]*[!a-zA-Z_0-9]*
Sie können es verwenden, case ... esac
um einen Mustervergleich mit dem Wert einer Variablen durchzuführen.
Spoilerwarnung:
#!/bin/sh LC_ALL=C Fall "$1" in [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"") echo 'NEIN' ;; *) echo 'JA' esacDies beantwortet auch „NEIN“ für eine Variable, deren Name leer ist. Beachten Sie, dass hier Shell-Globbing-Muster und keine regulären Ausdrücke verwendet werden und dass es in jeder POSIX-Shell ausgeführt werden kann, nicht nur inbash
.
Testen:
$ ./script.sh _ae
YES
$ ./script.sh 0a9oe
NO
$ ./script.sh aoeat
YES
$ ./script.sh aoeat-aoe
NO
Antwort4
#!/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
Dadurch wird versucht, den Wert dem angegebenen Wert zuzuweisen test
. Wenn dies gelingt (wenn der Wert ein gültiger Variablenname ist), wird der if
Test erfüllt und „Ja“ ausgegeben, andernfalls „Nein“.