Wie kann ich den Befehl „grep“ verwenden, um einen Wert aus den Argumenten zu extrahieren?

Wie kann ich den Befehl „grep“ verwenden, um einen Wert aus den Argumenten zu extrahieren?

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 bashgü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éphaneist 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 ... esacum 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'
esac
Dies 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 in bash.

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 ifTest erfüllt und „Ja“ ausgegeben, andernfalls „Nein“.

verwandte Informationen