2016-10-05 1 views
1

Je viens de voir un code avec un chèque si commeprocessus Bash id requête

for x in `ps -ef | awk '{ print $2 }'` 
    do 
     if [ "$x" != "PID" ];then 
     ----- do something ----- 
     fi 
    done 

Puis-je savoir pourquoi avons-nous besoin d'avoir ce contrôle si et que fait-il?

+0

Avez-vous exécuté la commande qui génère l'entrée de la boucle 'for'? –

+0

vous pouvez supprimer 'if condition' en modifiant légèrement l'instruction' awk' en 'ps -ef | awk 'NR> 1 {print $ 2}' '. Cela va sauter l'en-tête. –

+0

Ou, au lieu d'utiliser '-f' pour imprimer les informations que vous rejetez, faites simplement' pour x dans $ (ps -e -o pid =); faire ... ' –

Répondre

1

Si vous exécutez ps -ef, vous remarquerez qu'il imprimera un en-tête:

 UID  PID PPID TTY  STIME COMMAND 
[...] 

le contrôle saute l'en-tête.

1

ps -ef | awk '{ print $2 }' sorties 'comme ci-dessous; la première ligne est PID, donc si le statetement est utilisé, excluez la ligne PID;

[email protected]:/tmp$ ps -ef | awk '{ print $2 }' | head 
PID 
1 
2 
3 
5 
7 
8 
9 
10 

vous pouvez également utiliser sans si;

#!/bin/bash 
for x in `ps -ef | awk '{ print $2 }' | grep -v PID` 
do 
    #----- do something ----- 
    echo $x 
done 
2

Cette vérification est ajoutée pour ignorer la partie d'en-tête. vous pouvez supprimer l'instruction whole if en modifiant l'instruction awk pour ignorer la première ligne. Pour savoir quel en-tête est exécuté ps -eaf |head -n 1.

for x in $(ps -ef | awk 'NR>1{ print $2 }') 
    do 
      --------Do something with $x--------- 
    done 
+0

Des informations supplémentaires: certaines implémentations de' ps' ont un drapeau pour omettre d'écrire l'en-tête - consulter votre page man. Cela pourrait simplifier le script, mais au prix de la portabilité. –