исходя из оболочки bash, я пропустил легкое свертывание циклов (for i in (...); do... done;)
Не могли бы вы опубликовать типичные однострочники циклов в cshell?
ПОЖАЛУЙСТА, ОДИН СТРОКА, а не несколько строк, спасибо
исходя из оболочки bash, я пропустил легкое свертывание циклов (for i in (...); do... done;)
Не могли бы вы опубликовать типичные однострочники циклов в cshell?
ПОЖАЛУЙСТА, ОДИН СТРОКА, а не несколько строк, спасибо
Вау, я не писал csh
скрипт уже несколько лет. Но Билл Джой написал его сам, я полагаю, что это стоит некоторых ностальгических усилий...
set t=(*)
foreach i ($t)
echo $i >> /tmp/z
end
или просто foreach i (*)
Эта циклическая структура хорошо работает со встроенной в csh концепцией списка слов. Это как бы присутствует в bash, но не в ванильных оболочках posix.
set q=(how now brown cow)
echo $q[2]
Цикл foreach
аккуратно перебирает эту структуру данных.
;
и новую строку. Это не однострочник.
- person DigitalRoss; 12.10.2011
На справочной странице csh
указано:
Операторы foreach, switch и while, а также форма if-then-else оператора if требуют, чтобы основные ключевые слова появлялись в одной простой команде в строке ввода, как показано ниже.
а также
И foreach, и end должны появляться по отдельности в отдельных строках.
а также
Слова else и endif должны стоять в начале строк ввода; if должен стоять отдельно в строке ввода или после else.
а также
Пока и конец должны стоять по отдельности в своих строках ввода.
Я бы сказал, что я как-то исправил это, несмотря на параметры csh, поэтому вы можете сделать что-то вроде этого:
printf "while ( 1 ) \n ps -aux|grep httpd \n echo 'just a new row' \n sleep 2 \n end" | csh -f
Я изо всех сил пытался заставить оболочку CSH легко зацикливаться и запускать ту же команду.
Как указано в этом ответе: https://stackoverflow.com/a/1548355/1897481
Заставил меня отказаться от одного, делая работу с одним вкладышем.
В конце концов решили использовать следующие псевдонимы для запуска команд с аргументами* в цикле:
# 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'
Примеры выходных данных:
$> for_n_cmd 3 echo hi
=================
Iteration [1]
=================
hi
=================
Iteration [2]
=================
hi
=================
Iteration [3]
=================
hi
Пока цикл:
$> while_cmd_w_sleep 2s echo hello there
hello there
=================
Sleeping for 2s.
=================
hello there
=================
Sleeping for 2s.
=================
hello there
=================
Sleeping for 2s.
^C
* Пример, когда несколько команд выполняются в цикле:
$> 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
В этом примере в цикле выполняются три команды echo hi
, sleep 2s
и echo done waiting
.