Ich habe die folgende For- und If-Bedingung in einer Funktion definiert. Beim ersten Mal läuft sie gut. Beim zweiten Mal wird sie nach der For-Schleife nicht ausgeführt, sondern schreibt nur die Echo-Anweisung. Warum verhält sie sich so?
for outputFile in $outputFiles
do
echo"Output file is $outputFile"
if [ $outputFile == sampple*.pdf ]; then
FromFile=$OutputFilePath
transferFiles
fi
done
Antwort1
Um einen String anhand eines Datei-Globbing-Musters zu testen, verwenden Sie case
:
case "$outputFile" in
sampple*.pdf)
FromFile="$OutputFilePath"
transferFiles ;;
esac
So führen Sie einen Test einer Zeichenfolge anhand eines regulären Ausdrucks in bash
oder durch ksh93
:
if [[ "$outputFile" =~ ^sampple.*\.pdf$ ]]; then
FromFile="$OutputFilePath"
transferFiles
fi
Beachten Sie hier die Verwendung von [[ ... ]]
„und“ =~
anstelle von [ ... ]
„und“ ==
.
Die [ ... ]
Konstruktion unterstützt den ==
Operator zum Vergleichen von Zeichenketten grundsätzlich nicht.
Mit [[ ... ]]
und ==
wird die rechte Seite als Datei-Globbing-Muster verwendet. Daher sollte Folgendes (in bash
oder ksh93
) auch funktionieren:
if [[ "$outputFile" == sampple*.pdf ]]; then
# as before
fi