Comment utiliser des boucles dans l'invite de commande shell dans csh - la recherche de revêtements un décent
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
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.