
if [ ! $var = " *.awk " ] ; then
echo "$var contains awk file"
fi
das ist, was ich habe, aber wenn ich es ausführe und einen Dateinamen ohne eingebe, .awk
heißt es immer noch, enthält eine Awk-Datei
Antwort1
In bash
können Sie einen Globbing-Test durchführen mit
if [[ $var == *.awk ]]; then
echo '$var ends with ".awk"'
else
echo '$var does not end with ".awk"'
fi
Beachten Sie die doppelten eckigen Klammern und Gleichheitszeichen.
bash
unterstützt auch die Standardmethode zum Durchführen solcher Tests:
case $var in
*.awk) echo '$var ends with ".awk"' ;;
*) echo '$var does not end with ".awk"' ;;
esac
Beachten Sie, dass das Muster in beiden Fällen *.awk
nicht in Anführungszeichen gesetzt werden kann. Das Setzen von Anführungszeichen würde einen Zeichenfolgenvergleich und keinen Mustervergleich per Globbing zur Folge haben.
Es gibt zwei Gründe dafür, dass Ihr Test scheinbar immer erfolgreich ist:
- Sie testen gegen die Literalzeichenfolge
*.awk
(einschließlich eines Leerzeichens auf beiden Seiten), die vermutlich nie übereinstimmen wird, und - Den Test negieren Sie mit
!
.