Zeichenfolgen können nicht verglichen werden

Zeichenfolgen können nicht verglichen werden

Google hat mir nicht geholfen.

#!/bin/sh

j1=`expr "$1"`
j2=`expr "$2"`

while [ $j1 -le $j2 ]; do
    date=$(ncal -e $j1)
    month=$($date | cut -f1 -d' ')
    if [ $month=="April" ]; then
        echo $date
    fi
        j1=`expr $j1 + 1`
done

Ich möchte das Osterdatum nur für die Jahre ausgeben, in denen es im Monat April liegt (im Bereich zwischen den beiden Jahren, die ich als Argumente übergeben habe). Aber irgendwie bekomme ich die Ausgabe:

...

April 5 2015
./script.sh: 8: March: not found
March 27 2016
./script.sh: 8: April: not found
April 16 2017

Was bedeutet „Monat: nicht gefunden“? Und warum wird März gedruckt, obwohl ich nur nach April frage?

Ich habe es auf verschiedene Arten probiert und es trat immer ein Fehler auf.

Ich muss auch die Bedingung hinzufügen, dass nur die Daten gedruckt werden, die nach dem 20. April liegen, aber selbst damit komme ich nicht klar.

Antwort1

An der Leitung

month=$($date | cut -f1 -d' ')

Sie führen den Inhalt $dateals Befehl aus und leiten die Ausgabe an weiter cut.

Ich glaube, du willst

month=$( printf '%s\n' "$date" | cut -f 1 -d ' ' )

Hier.

Mischen Sie außerdem keine Backticks und $(...)im selben Skript, das ist verwirrend. Verwenden Sie $(...)stattdessen einfach.

Der Vergleich von Zeichenfolgen erfolgt mit =:

if [ "$month" = "April" ]; then

Stellen Sie sicher, dass Sie Ihre Variablen in doppelte Anführungszeichen setzen. SieheSicherheitsimplikationen, wenn vergessen wird, eine Variable in Bash/POSIX-Shells in Anführungszeichen zu setzen

Ganzzahlarithmetik kann mit durchgeführt werden $(( expression )). exprist veraltet.

j1=$(( "$1" ))
j2=$(( "$2" ))

...

j1=$(( j1 + 1 ))

verwandte Informationen