Comment utiliser des boucles dans l'invite de commande shell dans csh - la recherche de revêtements un décent

StackOverflow https://stackoverflow.com/questions/1544325

  •  20-09-2019
  •  | 
  •  

Question

en provenance de shell bash, j'ai raté sur un roulement facile des boucles (pour i en (...), ne ... fait;)

Voulez-vous envoyer one-liners typiques de boucles dans cShell?

revêtements un S'IL VOUS PLAÎT, et non pas plusieurs lignes thx

Était-ce utile?

La solution

Wow, je ne l'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 la 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 a csh d'une liste de mots . Ce genre est présent dans de-bash, mais pas dans des coquilles de vanille posix.

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

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

Autres conseils

Les états de page man csh:

  

Les 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 simple commande unique sur une ligne d'entrée comme indiqué ci-dessous.

et

  

Les deux foreach et de fin doivent apparaître seul sur des lignes séparées.

et

  

Les mots et d'autre endif doivent apparaître au début des lignes d'entrée; le cas 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.

Je dirais que je l'ai fixé en quelque sorte, en dépit des options csh, vous pouvez donc 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

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

Comme l'a souligné cette réponse: https://stackoverflow.com/a/1548355/1897481

En me livrer un travail de faire une oneliner.

Enfin réglés 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top