2012-09-13 2 views
0

Je rencontre un problème où ma liste d'arguments pour l'écho est trop longue et j'aimerais avoir des idées sur la façon de contourner ce problème, ou du moins tester la condition pour pouvoir gérer correctement , et il ne sera pas tuer mon scriptEcho: Liste d'arguments trop longue

for file in `cat filelist`; do 
    PROTOCOLS1=`egrep -i 'rsh|rsync|remsh' "$file" | egrep -v '^[ |  ]*#'` 
    FIELDS=`echo $PROTOCOLS1|wc -l` 
    if [[ $FIELDS -gt 1024 ]]; then 
     echo $file >> $debuglog 
    else 
     set -A myarray $PROTOCOLS1 
     do stuff..... 
    fi 
done 

le problème est que lorsque ma liste de arg pour écho est trop long, $FIELDS est définie sur null, et donc mon test pour $FIELDS -gt 1024 est toujours vrai et ne se faire prendre. Le problème est quand il va à la rangée c'est évidemment trop grand et j'obtiens un indice hors de l'erreur de gamme et mon manuscrit se termine.

Toutes les idées sont grandement appréciées.


Modifier 9/18

OK si le problème est un peu plus basique.

myserver-v1> echo $variable 
myserver-v1> /usr/bin/echo: too many args 

Je veux tester cela dans mon script

J'ai essayé ce qui suit, ce qui fonctionne, mais je reçois toute cette merde à stdout, qui remplit mon journal de débogage et est ennuyeux

echo $variable 
if [[ $? -ne 0 ]]; then 
write to error log 
fi 

Existe-t-il un moyen de tester la variable echo $ .... sans l'envoyer à stdout? J'ai essayé ce qui suit, mais ni l'un ni l'autre ne semblait fonctionner, alors je suis un peu perdu ici.

[[ ! `echo $variable ]] 
[[ `echo $variable ]] 
+0

Pourquoi ne pas simplement utiliser $ {# myarray [*]} 'pour obtenir la longueur du tableau (qui ressemble au nombre de champs) après l'avoir défini?(désolé, je suis moins familier avec ksh que bash) –

+0

'$ (# myarry [*]}' fonctionne dans ksh93 (le std sur les systèmes Linux à 99% (qui ne sont pas réellement pdksh) Si 'echo $ {. sh.version} 'renvoie n'importe quoi, alors vous avez un ksh93 Bonne chance à tous – shellter

+0

@evilotto Je ne peux pas utiliser' $ {# myarray [*]} 'parce que cela nécessiterait que le tableau existe déjà .... le problème est je ne peux pas créer un tableau sur 1024 éléments/champs ... donc je dois pouvoir le tester avant de lancer 'set -A array' – nitrobass24

Répondre

1

Si vous gardez la variable $PROTOCOLS1 non indiquée dans le echo, vous pouvez simplifier la vie en remplaçant:

FIELDS=`echo $PROTOCOLS1|wc -l` 

avec

FIELDS=1 

En effet, lorsque vous écho $PROTOCOLS1 sans guillemets Autour d'elle, vous aurez seulement une ligne de sortie (peut-être très longue). Vous pouvez également utiliser:

FIELDS=$(echo "$PROTOCOLS1" | wc -l) 

où les guillemets doubles préserveront les nouvelles lignes de la valeur de protocoles1 (mais il vous permet de reprendre au problème 'liste d'arguments trop long).

Donc, vous devez penser à utiliser:

FIELDS=$(egrep -i 'rsh|rsync|remsh' "$file" | egrep -c -v '^[ |  ]*#') 

qui obtient la deuxième egrep à faire la ligne de comptage pour vous. Évidemment, puisque la partie postérieure du script utilise $PROTOCOLS1, vous devrez réévaluer le egreps pour obtenir les données, mais vous devriez penser à savoir si votre schéma de traitement est approprié. Si vous utilisez une valeur de chaîne trop longue, vous ne faites probablement pas le meilleur traitement. Qu'est-ce que les alternatives sont dépendent de ce que vous essayez de faire, et la question ne révèle pas cela. Il peut être approprié d'effectuer le traitement supplémentaire avec un langage de script tel que Perl, Python ou Ruby.