KornShell - Test avec une variable qui peut être non définie
J'ai le code suivant dans 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
#...
Dans certains cas, le nom de fichier sans extension, et ce qui provoque le FILE_EXT
variable est vide, ce qui provoque l'erreur suivante:
./script[37]: test: 0403-004 Specify a parameter with this command.
Comment dois-je être l'appel de cette fonction, de sorte que je n'ai pas cette erreur?
Je m'attends à l'ensemble du nom de fichier pour être dans le FILE_EXT plutôt que rien, à moins que le nom de fichier se termine par '.'
OriginalL'auteur C. Ross | 2009-12-11
Vous devez vous connecter pour publier un commentaire.
Vous devriez laisser tomber les crochets lorsque vous testez le code de sortie d'une fonction, sinon, vous aurez toujours le "vrai". Aussi, vous devez indiquer votre variable. Vous pourriez mettre un test supplémentaire pour un vide de l'extension comme indiqué:
Edit: ajoutée test de gérer les noms de fichiers qui se terminent par "."
Oui, vous devez indiquer votre variable.
OriginalL'auteur Dennis Williamson
Je voudrais faire cela:
Si tout ce que vous voulez faire est de déterminer que le fichier a une extension numérique
La
${FILE_EXT:="no"}
étendra à la valeur de FILE_EXT, ou " non " si FILE_EXT est null ou vide.Ya, bonne prise.
OriginalL'auteur John Weldon
vous devez utiliser
${FILE##*.}
avec double "#" à la place. également que voulez-vous dire que la variable $FILE_EXT sera vide? si votre fichier n'ont pas d'extension, puis, lorsque vous ne${FILE#*.}
, vous obtiendrez la juste de nom de fichier dansFILE_EXT
. comment est-il vide ?OriginalL'auteur ghostdog74
En supposant ksh93, il devrait être possible d'utiliser son propre calcul. Mais nous devons être prudents:
Juste ((n)) échouera si n==0, alors nous avons test pour ((n || !n)), ce qui devrait être toujours le cas pour n'importe quel nombre.
Pour éviter ksh de quitter, nous courons à l'expression dans un shell interne est exécuté ( ), en ajoutant des espaces pour éviter des conflits avec l'expression arithmétique (( ... )).
Enfin, nous fermons stderr avec '2>& -" pour éviter les messages d'erreur de non numérique arguments, mais vous pourriez vouloir garder à l'intérieur.
OriginalL'auteur Henk Langeveld
[ -z "$1" ]
va tester un vide$1
, comme[ "" = "$1" ]
.Ou vous pouvez simplement ajouter un "0" à
$1
(j'.e,"0$1"
) pour le forcer à être non vide avant de vérifier s'il est numérique (si vous voulez vider les extensions à être traités comme numérique).OriginalL'auteur David R Tribble
J'ai eu des probs pour exécuter votre script (Peut-être parce que im en utilisant pdksh). Donc j'ai ajusté un peu. Essayez ceci:
OriginalL'auteur user224243