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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top