KornShell - Test con la variabile non è impostata
Domanda
Ho il seguente codice in 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 alcuni casi il nome del file non ha estensione, e in questo modo il FILE_EXT
variabile vuoto, che causa l'errore seguente:./script[37]: test: 0403-004 Specify a parameter with this command.
Come devo chiamare questa funzione in modo che non si ottiene questo errore?
Soluzione
Si dovrebbe lasciare fuori le parentesi quadre quando si verifica il codice di uscita di una funzione, in caso contrario, si otterrà sempre "vero".Inoltre, si dovrebbe citare il variabile.Si potrebbe mettere un ulteriore test per un'estensione vuota, come mostrato:
FILE_EXT=${FILE#*.}
if isNumeric "${FILE_EXT}" &&
[ "${FILE_EXT}" != "${FILE}" -a "${FILE_EXT}" != "" ]
then
echo "Numbered file."
fi
Edit: aggiunto test di gestire i nomi di file che termina in "."
Altri suggerimenti
Vorrei fare questo:
if [ isNumeric ${FILE_EXT:="no"} ]; then
echo "Numbered file."
fi
Se tutto quello che vogliamo fare è determinare che il file ha un'estensione numerica
Il ${FILE_EXT:="no"}
si espanderà sia al valore di FILE_EXT, o 'no' se FILE_EXT è nullo o vuoto.
si dovrebbe usare ${FILE##*.}
con letto "#", invece. anche quello che vuoi dire il $ FILE_EXT variabile sarà vuota? se il file non hanno estensione, poi, quando si fa ${FILE#*.}
si otterrà il solo nome del file in FILE_EXT
. come è vuoto?
Supponendo ksh93, dovrebbe essere possibile utilizzare il proprio aritmetica. Ma dobbiamo stare attenti: Basta ((n)) avrà esito negativo se n == 0, quindi ci prova per ((n ||! N)), che dovrebbe essere sempre vero per qualsiasi numero corretto.
Per evitare che ksh di uscire, si corre l'espressione in una subshell (), l'aggiunta di spazi per evitare conflitti con l'espressione aritmetica ((...)).
Infine, chiudiamo stderr con '2> & -'. Per prevenire eventuali messaggi di errore da argomenti non numerici, anche se si potrebbe desiderare di tenerli in
function isNumeric {
(
typeset n=${1:?}
((n||!n))
) 2>& -
}
[ -z "$1" ]
proverà per un $1
vuoto, come sarà [ "" = "$1" ]
.
Oppure si potrebbe semplicemente anteporre uno "0" per $1
(cioè, "0$1"
) per costringerla ad essere non vuoto prima di controllare se è numerico (se volete le estensioni vuote da trattare come numerico).
Ho avuto qualche probs per eseguire lo script (Forse perché im utilizzando pdksh). Così ho regolato leggermente. Prova questo:
#!/usr/bin/ksh
FILE=$1
FAILURE=1
SUCCESS=0
isNumeric ()
{
if [ -n "$1" ]
then
case $1 in
*[!0-9]* | "")
echo "$1 not a number"
return $FAILURE
;;
* )
echo "$1 is a number"
return $SUCCESS
;;
esac
else
echo "parameter is empty"
return $FAILURE
fi
}
#...
FILE_EXT=${FILE#*.}
echo $FILE_EXT
isNumeric "${FILE_EXT}"
if [ "$?" = "0" ]
then
echo "Numbered file."
fi