2009-10-09 4 views

Répondre

2

Wow, je n'ai pas écrit un script csh depuis des années. Mais Bill Joy n'écrire lui-même, je suppose que ça vaut un peu d'effort de nostalgie ...

set t=(*) 
foreach i ($t) 
    echo $i >> /tmp/z 
end 

ou tout simplement foreach i (*)

Cette structure de boucle fonctionne bien avec un concept intégré qui csh a un mot liste. C'est un peu présent dans bash mais pas dans les coquilles de posix de vanille.

set q=(how now brown cow) 
echo $q[2] 

La boucle foreach de manière ordonnée itère cette structure de données.

+1

* Mise à jour: * Ok, ok, eh bien, je ne sais pas comment faire des boucles one-liner dans csh. La grammaire csh gère ';' et newline différemment. Ce n'est pas un interligne. – DigitalRoss

10

Les états de page homme csh:

Le foreach, switch et while, ainsi que l'if-then-else forme de l'instruction if exigent que les principaux mots clés apparaissent dans une seule commande simple sur une ligne d'entrée comme indiqué ci-dessous.

et

Les deux foreach et de fin doivent apparaître seul sur des lignes distinctes.

et

Les mots et d'autre endif doivent apparaître au début des lignes d'entrée; le si doit apparaître seul sur sa ligne d'entrée ou après un autre.

et

Le tout et à la fin doivent apparaître seul sur leurs lignes d'entrée.

+2

Voir aussi "contrôle de flux" dans Csh Programmation considérée comme nuisible: http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ –

1

Je dirais que je l'ai fixé en quelque sorte, en dépit des options csh, de sorte que vous pouvez faire quelque chose comme ceci:

printf "while (1) \n ps -aux|grep httpd \n echo 'just a new row' \n sleep 2 \n end" | csh -f 
0

Je me suis battu pour obtenir shell csh pour boucler facilement sur et exécuter le même commande plus.

Comme indiqué par cette réponse: https://stackoverflow.com/a/1548355/1897481

m'a fait renoncer à l'un faisant un travail de oneliner.

Enfin réglé pour avoir les alias suivants pour exécuter des commandes avec des arguments * dans une boucle:

# while_cmd_w_sleep <SLEEP-TIME> <CMD + ARGS> 
    alias while_cmd_w_sleep '(echo '\''while (1)\n\!:2*\necho =================\necho Sleeping for \!:1.\nsleep \!:1\necho =================\nend'\'') | tcsh' 

    # for_n_cmd <LOOP_COUNT> <CMD + ARGS> 
    alias for_n_cmd   '(echo '\''foreach x (`seq \!:1`)\necho =================\necho Iteration \[$x]\necho =================\n\!:2*\nend'\'') | tcsh' 

    # for_n_cmd_w_sleep <LOOP_COUNT> <SLEEP-TIME> <CMD + ARGS> 
    alias for_n_cmd_w_sleep '(echo '\''foreach x (`seq \!:1`)\necho =================\necho Iteration \[$x]\necho =================\n\!:3*\necho =================\necho Sleeping for \!:2.\nsleep \!:2\nend'\'') | tcsh' 

sorties d'exemples:

$> for_n_cmd 3 echo hi 
    ================= 
    Iteration [1] 
    ================= 
    hi 
    ================= 
    Iteration [2] 
    ================= 
    hi 
    ================= 
    Iteration [3] 
    ================= 
    hi 

La boucle while:

$> while_cmd_w_sleep 2s echo hello there 
    hello there 
    ================= 
    Sleeping for 2s. 
    ================= 
    hello there 
    ================= 
    Sleeping for 2s. 
    ================= 
    hello there 
    ================= 
    Sleeping for 2s. 
    ^C 

* Exemple où plusieurs commandes sont exécutées dans une boucle:

$> for_n_cmd 3 'echo hi\\nsleep 2s\\necho done waiting' 
    ================= 
    Iteration [1] 
    ================= 
    hi 
    done waiting 
    ================= 
    Iteration [2] 
    ================= 
    hi 
    done waiting 
    ================= 
    Iteration [3] 
    ================= 
    hi 
    done waiting 

Dans cet exemple, trois commandes echo hi, sleep 2s et echo done waiting sont exécutées dans la boucle.

Questions connexes