Verarbeiten einer Ja / Nein-Antwort vom Bash-Benutzer


11

Das kann sehr gut Dummheit meinerseits sein. Ich möchte Ja / Nein-, Richtig / Falsch-Antworten in meinem Bash-Skript akzeptieren:

test.sh

#!/bin/bash

ARGUMENT=$1

echo User passed in $ARGUMENT

OPTARG=${ARGUMENT:0:1}

if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then
    echo Decline
elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then
    echo Accept
else
    echo Invalid argument
fi

Hier einige Beispielergebnisse:

./test.sh 0

User passed in 0
Decline

./test.sh 1

User passed in 1
Accept

./test.sh 2

User passed in 2
Invalid argument

./test.sh Nr

User passed in No
Decline

Jetzt der Stumper. Warum wird [[ "${OPTARG^^}" == "N" ]]für jede Zeichenfolge true zurückgegeben?

./test.sh Ja

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

Was passiert, wenn Sie dies zitieren? OPTARG = "$ {ARGUMENT: 0: 1}"
mikeserv

1
Keine Ursache. Goldlöckchen ist richtig.
Mikeserv

Antworten:


10

Dies:

if [[ "$OPTARG" -eq 0 ]] 

Stimmt mit jeder Zeichenfolge überein, es sei denn, es handelt sich nur um Ziffern. Verwenden:

if [[ "$OPTARG" == "0" ]] 

Stattdessen.


8

Obwohl das Problem in Ihrem Code durch Goldlöckchen gut erklärt wurde , kann ich nicht widerstehen zu sagen, dass Ihr Code unnötig lang ist. Sie könnten es sehr vereinfachen.

Folgendes entspricht Ihrem gewünschten Code:

echo User passed in $1
if [[ "$1" == [nN0]* ]]; then      # First argument starts with either n, N, or 0
    echo Decline
elif [[ "$1" == [yY1]* ]]; then    # First argument starts with either y, Y, or 1
    echo Accept
else
    echo Invalid argument
fi

Möglicherweise möchten Sie auch auf Bedingte Konstrukte im Handbuch verweisen .


Danke, devnull. Ich werde diesen Trick definitiv in zukünftigen Skripten verwenden! Ich war hin und her gerissen, ob ich Ihre Antwort akzeptieren sollte, aber ich denke, dass die Unterschiede in der Antwort von Goldlöckchen für andere hilfreich sein können.
i_grok

@i_grok Ich habe in meiner Antwort erwähnt, dass die Antwort von Goldlöckchen auf das Problem hinweist. Ich habe einfach einen alternativen Ansatz vorgestellt, der lesbarer zu sein schien . Es ist gut zu sehen, dass mehrere Ansätze zur Lösung eines Problems auftauchen. Welche Antwort akzeptiert wird, ist eine relativ triviale Angelegenheit.
devnull

6

Auch können Sie verwenden case

read -p 'Do you want to Continue (yes/no?): ' 
case $REPLY in
       [yY]|[yY][eE][sS]) echo Accept             ;;
           [nN]|[nN][oO]) echo Decline            ;;
                       *) echo "Invalid argument" ;;
esac
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.