KornShell - Test mit der variable kann nicht gesetzt werden
Ich habe den folgenden code in der KornShell (ksh):
FAILURE=1
SUCCESS=0
isNumeric(){
if [ -n "$1" ]; then
case $1 in
*[!0-9]* | "") return $FAILURE;
* ) return $SUCCESS;
esac;
else
return $FAILURE;
fi;
}
#...
FILE_EXT=${FILE#*.}
if [ isNumeric ${FILE_EXT} ]; then
echo "Numbered file."
fi
#...
In einigen Fällen den Namen der Datei keine Erweiterung haben, und dies bewirkt, dass die FILE_EXT
variable leer zu sein, das verursacht die folgende Fehlermeldung:
./script[37]: test: 0403-004 Specify a parameter with this command.
Wie soll ich das aufrufen dieser Funktion, so dass ich nicht diese Fehlermeldung erhalten?
Ich würde erwarten, dass das ganze mit dem Namen zu sein, in der FILE_EXT eher als nichts, es sei denn, der Dateiname endet mit '.'
InformationsquelleAutor C. Ross | 2009-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lassen Sie die eckigen Klammern sind, wenn Sie die Prüfung der exit-code eine Funktion, ansonsten erhalten Sie immer "true". Auch sollten Sie Ihr Angebot variabel. Könnten Sie einen zusätzlichen test für eine leere Erweiterung, wie gezeigt:
Edit: Hinzugefügt-test-handle, Dateinamen, Ende in "."
Ja, Sie sollten Ihr Angebot variabel.
InformationsquelleAutor Dennis Williamson
Ich würde dies tun:
Wenn alles, was Sie tun wollen, ist festzustellen, dass für die Datei eine numerische Erweiterung
Den
${FILE_EXT:="no"}
erweitern, um entweder den Wert FILE_EXT, oder 'no' wenn FILE_EXT ist null oder leer.Ya, gut zu fangen.
InformationsquelleAutor John Weldon
sollten Sie verwenden
${FILE##*.}
mit Doppel - " # " statt. auch was du meinst die variable $FILE_EXT leer? wenn Sie Ihre Datei nicht über eine Erweiterung, dann, wenn Sie${FILE#*.}
erhalten Sie die Datei-Namen inFILE_EXT
. wie ist es leer ?InformationsquelleAutor ghostdog74
Vorausgesetzt, ksh93, sollte es möglich sein, verwenden Sie es auf eigene Arithmetik. Aber wir müssen vorsichtig sein:
Nur ((n)) schlägt fehl, wenn n==0, so testen wir für ((n || !n)), die sollten immer wahr sein, für jede richtige Zahl.
Um zu verhindern, dass die ksh verlassen, führen wir den Ausdruck in einer subshell ( ), hinzufügen von Räumen zu verhindern, dass Konflikte mit den arithmetischen Ausdruck (( ... )).
Schließlich, schließen wir stderr mit '2>& -' um zu verhindern, dass etwaige Fehlermeldungen nicht numerische Argumente, obwohl möchten Sie vielleicht, um Sie zu halten in.
InformationsquelleAutor Henk Langeveld
[ -z "$1" ]
zu testen, wird für eine leere$1
wie[ "" = "$1" ]
.Oder können Sie einfach voranstellen einer "0" zu
$1
(ich.e"0$1"
) zu erzwingen, um nicht leer sein, bevor die überprüfung, ob es numerisch ist (wenn Sie leer Erweiterungen behandelt werden als numerisch).InformationsquelleAutor David R Tribble
Hatte ich einige probs für die Ausführung des Skripts (Vielleicht, weil im mit pdksh). Also ich habe verstellt es sich leicht. Versuchen Sie dies:
InformationsquelleAutor user224243