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 $date
als 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 ))
. expr
ist veraltet.
j1=$(( "$1" ))
j2=$(( "$2" ))
...
j1=$(( j1 + 1 ))