Comment utiliser l’exportation dans le shell bash?

Je fais un script pour supprimer tous les travaux d’impression antérieurs à un jour et aucun des travaux antérieurs à un jour ne doit être imprimé aussi le jobid qui a été annulé

Voici quelques conditions que je dois suivre

Je n’ai pas access au répertoire cups, je ne peux créer aucun fichier temporaire. Je dois utiliser le shell Bash.

J’ai essayé d’utiliser une variable, déclarée en dehors de la boucle mais la valeur de la variable rest inchangée ~ est venue à cause du processus enfant Essayé d’utiliser la variable d’exportation

J’ai essayé ci-dessous la logique:

count=0 currDate=`date +%Y%m%d` lpstat -o|while read line do jobid=`echo $line|awk '{print $1}'|cut -d"-" -f2` jobDate=`echo $line|awk -F ' ' 'BEGIN{OFS="-";} {print $5,$6,$7;}'` formattedDate=`date -d"${jobDate}" +%Y%m%d` if [ `expr $currDate - $formattedDate` -gt 1 ] then count=`expr $count + 1` echo " cancelling printer job with jobid $jobid " cancel $jobid fi; done [ $count -gt 0 ] ; echo "NO of Printer jobs pending more than 1 days are $count"; 

Ne comprenant pas comment gérer la variable count de la manière mentionnée ci-dessus, elle ne fonctionnera pas. Export ne fonctionne pas dans le shell bash, la création d’un fichier tmp n’est pas autorisée.

Toute suggestion pour obtenir la solution.

Le problème avec count est que vous le traitez dans un nouveau processus enfant bash (bash le crée automatiquement lorsque vous insérez des entrées dans while). C’est pourquoi vous récupérez la valeur initiale.

La solution pour vous consisterait à afficher la valeur dans ce processus enfant. Cela devrait fonctionner (les accolades obligent bash à créer un processus enfant incluant la partie sortie):

 count=0 currDate=`date +%Y%m%d` lpstat -o| (while read line do jobid=`echo $line|awk '{print $1}'|cut -d"-" -f2` jobDate=`echo $line|awk -F ' ' 'BEGIN{OFS="-";} {print $5,$6,$7;}'` formattedDate=`date -d"${jobDate}" +%Y%m%d` if [ `expr $currDate - $formattedDate` -gt 1 ] then count=`expr $count + 1` echo " cancelling printer job with jobid $jobid " cancel $jobid fi; done [ $count -gt 0 ] && echo "NO of Printer jobs pending more than 1 days are $count") 

La solution la plus simple consiste à référencer la variable dans le même shell que vous définissez. Syntactiquement, le plus simple est d’append un bloc:

 count=0 currDate=`date +%Y%m%d` lpstat -o| { while read line # Add opening brace here do jobid=`echo $line|awk '{print $1}'|cut -d"-" -f2` jobDate=`echo $line|awk -F ' ' 'BEGIN{OFS="-";} {print $5,$6,$7;}'` formattedDate=`date -d"${jobDate}" +%Y%m%d` if [ `expr $currDate - $formattedDate` -gt 1 ] then count=`expr $count + 1` echo " cancelling printer job with jobid $jobid " cancel $jobid fi; done echo "Number of Printer jobs pending more than 1 day: $count" } # Add closing brace here 

Ce n’est pas un site de révision de code, mais je me sens obligé de traiter d’autres éléments de ce code. echo $line | awk '{print $1}' | cut -d"-" -f2 echo $line | awk '{print $1}' | cut -d"-" -f2 est une atrocité. Plutôt que de lire une ligne entière et de l’parsingr ensuite avec echo / awk / cut, laissez read faire l’parsing pour vous en assignant IFS de manière appropriée. Arrêtez d’utiliser des backticks. $() notation $() est meilleure. La dernière ligne de ce code [ $count -gt 0 ]; echo ... [ $count -gt 0 ]; echo ... ignore complètement l’évaluation de $ count. Il serait mieux écrit [ $count -gt 0 ] || echo ... >&2 [ $count -gt 0 ] || echo ... >&2 ou test "$count" = 0 && echo ... >&2 (redirigez le message d’erreur vers le descripteur de fichier 2, car l’erreur appartient à stderr).