2009-12-11 5 views
4

Je le code suivant dans KornShell (ksh):KornShell - test avec la variable qui peut être pas réglée

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 
#... 

Dans certains cas, le nom de fichier pas une extension, ce qui provoque d'être la variable FILE_EXT vide, ce qui provoque l'erreur suivante: ./script[37]: test: 0403-004 Specify a parameter with this command.

Comment devrais-je appeler cette fonction afin que je ne reçoive pas cette erreur?

+0

je me attendrais le nom du fichier entier pour être en le FILE_EXT plutôt que rien, à moins que le nom du fichier se termine par '.' –

Répondre

5

Vous devez laisser les crochets entre crochets lorsque vous testez le code de sortie d'une fonction, sinon, vous aurez toujours "vrai". En outre, vous devriez citer votre variable. Vous pouvez mettre un test supplémentaire pour une extension vide comme indiqué:

FILE_EXT=${FILE#*.} 

if isNumeric "${FILE_EXT}" && 
    [ "${FILE_EXT}" != "${FILE}" -a "${FILE_EXT}" != "" ] 
then 
    echo "Numbered file." 
fi 

Edit: « » ajouté test pour gérer les noms de fichiers qui se terminent par

+0

Cela ne tient pas compte des fichiers qui se terminent par '.' –

+0

Oui, vous devez indiquer votre variable. – javaPlease42

0

[ -z "$1" ] va tester pour un $1 vide, tout comme [ "" = "$1" ].

Ou vous pouvez simplement préfixer un « 0 » à $1 (i.e., "0$1") pour le forcer à être vide avant de vérifier si elle est numérique (si vous voulez des extensions vides à traiter comme numérique).

1

Je fais ceci:

if [ isNumeric ${FILE_EXT:="no"} ]; then 
    echo "Numbered file." 
fi 

Si tout ce que vous voulez faire est de déterminer que le fichier a une extension numérique

Le ${FILE_EXT:="no"} étendra soit la valeur de file_ext, ou « non » si FILE_EXT est nul ou vide.

+1

Faux positif pour les noms de fichiers constitués uniquement de chiffres puisque $ FILE_EXT contiendra le nom de fichier complet s'il n'y a aucun point. –

+0

Ya, bonne prise. –

0

J'ai eu quelques probs pour exécuter votre script (Peut-être parce que j'utilise pdksh). Je l'ai donc légèrement ajusté. Essayez ceci:

#!/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 
1

vous devriez utiliser ${FILE##*.} avec le double "#" à la place. aussi que voulez-vous dire la variable $ FILE_EXT sera vide? Si votre fichier n'a pas d'extension, alors quand vous faites ${FILE#*.} vous obtiendrez le nom du fichier juste FILE_EXT. comment est-il vide?

1

En supposant que ksh93, il devrait être possible d'utiliser sa propre arithmétique. Mais nous devons faire attention: Just ((n)) échouera si n == 0, donc nous testons pour ((n ||! N)) ce qui devrait toujours être vrai pour tout nombre correct.

Pour empêcher la sortie de ksh, nous exécutons l'expression dans un sous-shell(), en ajoutant des espaces pour éviter les conflits avec l'expression arithmétique ((...)).

Finalement, nous fermons stderr avec « 2> & - ». Pour éviter les messages d'erreur d'arguments non numériques, bien que vous pouvez les garder à l'

function isNumeric { 
    (
    typeset n=${1:?} 
    ((n||!n)) 
) 2>& - 
} 
Questions connexes