
Ich möchte prüfen, ob ein String, der über den Befehl read in eine Variable in bash geschrieben wurde, ein Tupel aus zwei Zahlen ist. Meines Wissens sollte dies möglich sein mit
if [[ "$input" =~ "$regex" ]]; then ...
für ein Tupel aus zwei Zahlen, getrennt durch mindestens ein Leerzeichen und eine beliebige Anzahl von Leerzeichen davor und danach, habe ich versucht
$regex="^ *[0-9]+ +[0-9]+ *$"
das sollte übereinstimmen
12 123
23 3246543
123 345
34 23
1 234
aber nicht
123 123 123
1235124
123w123 123
etc.
das funktioniert jedoch nicht...
Antwort1
POSIXShell-Skriptfunktion, verwendet Parametererweiterung, um die erste und zweite Zahl zu erhalten, -eq
ist nur erfolgreich, wenn es zwei Argumente gibt, die beide dieselbe Zahl sind (und schlägt fehl, wenn es weniger oder mehr Argumente gibt oder wenn eines davon Buchstaben enthält) und !=
prüft auf ein Leerzeichen. Gibt zurückWAHRnur wenn es ein Zwei-Zahlen-Tupel ist:
is_tup() { [ ${1% *} -eq ${1% *} -a \
${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }
Prüfen:
echo '12 123
23 3246543
123 345
34 23
1 234
123 123 123
1235124
123w123 123' |
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done
Ausgabe:
yes 12 123
yes 23 3246543
yes 123 345
yes 34 23
yes 1 234
no 123 123 123
no 1235124
no 123w123 123