2010-10-27 6 views
3

J'ai une question sur la commande de test dans KornShell (ksh). Je sais -ne est pour comparer des entiers et != est pour comparer des chaînes. Comment la commande de test va-t-elle se comporter si un argument est une chaîne et l'autre est un entier? J'ai les conditions ci-dessous dans mon code et les deux fonctionnent correctement.commande de test dans KornShell (ksh)

code:

myCount=1 
myCount=`expr $myCount+ 0` 
temp=`ps -aef | grep damn | wc -l` 
if [ $temp -ne $myCount]; then 
     echo ERROR Number 
fi 

if [ $temp != $myCount ]; then 
     echo ERROR Strings 
fi 

Sortie:

ERROR Number 
ERROR Strings 

Répondre

1

Le type n'est pas pertinent, car il est une simple substitution de texte. En d'autres termes, la valeur de la variable $temp sera remplacée à la place de $temp (par exemple).

Au moins pour la version de ksh Je cours, pour la comparaison numérique, si la valeur commence par un non-numérique, cela équivaudra à 0. Si elle commence par un numérique mais contient des non-numériques, vous obtiendra une erreur.

Par exemple:

$ export s1=xyz 
$ export s2=7xyz 
$ export i1=0 
$ if [ $i1 -eq $s1 ] 
> then 
>  echo equal 
> fi 
equal 
$ if [ $i1 -eq $s2 ] 
> then 
>  echo equal 
> fi 
ksh: 7xyz: bad number `7xyz' 

Toutefois, en fonction de vos commentaires, qui ne peut être le cas pour toutes les versions de ksh. Sur cette base, j'essaierais d'utiliser des comparaisons de chaînes pour les chaînes et les comparaisons numériques pour les nombres. Tout le reste peut être non portable.

+0

Voulez-vous dire, si [$ temp -eq $ myCount]; then echo ERROR Strings affiche toujours le message tant que la valeur de temp n'est pas numérique. –

+0

Pas tout à fait, voir la mise à jour. Si le nombre _starts_ comme un numérique mais contient des non-numériques, il va erreur. Pour une variable qui ne commence pas numeric, elle est traitée comme 0. – paxdiablo

+0

Sur mon shell, $ export s1 = xyz $ export s2 = 7xyz $ export i1 = 0 $ si [$ i1 -eq $ s1]> alors> echo égal > fi $ xyz: mauvais –

0

Utilisation ksh93 et ​​GNU coreutils expr 7.4 votre commande:

myCount=`expr $myCount+ 0` 

me donne une erreur de syntaxe et définit myCount à NULL, qui provoque à la fois if déclarations de sortie "ksh: [Argument attendu" erreurs. Essayez de mettre un espace avant le signe plus. En outre, il doit y avoir un espace avant ].

Vous ne devriez pas avoir besoin de convertir myCount ou temp en entiers. La coercition de myCount en utilisant expr est complètement inutile.

Je préfère cette forme pour comparer des entiers, car il vous permet d'utiliser des opérateurs de comparaison symboliques tels que != et > au lieu de -ne et -gt:

if (($temp != $myCount)) 
1

Mais votre code est erroné de toute façon.

temp = ps -aef | grep damn | wc -l retournera toujours au moins 1, car il trouvera la commande grep en plus d'être une chaîne remplie d'espaces de début, ce qui explique pourquoi vos deux tests sont vrais.

La dérivation vers wc est également inutile puisque le commutateur -c de grep compte pour vous.

meilleur code serait:

temp = ps -aef |grep damn |grep -cv grep qui retourne le nombre de cas en cours d'exécution de processus contenant la chaîne putain et ce sera un numéro.

Questions connexes