Как использовать циклы for в командной строке в оболочке csh в поисках достойных вкладышей

исходя из оболочки bash, я пропустил легкое свертывание циклов (for i in (...); do... done;)

Не могли бы вы опубликовать типичные однострочники циклов в cshell?

ПОЖАЛУЙСТА, ОДИН СТРОКА, а не несколько строк, спасибо


person vehomzzz    schedule 09.10.2009    source источник


Ответы (4)


Вау, я не писал 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    schedule 09.10.2009
comment
Обновление: Хорошо, хорошо, я не знаю, как делать однострочные циклы в csh. Грамматика csh по-разному обрабатывает символы ; и новую строку. Это не однострочник. - person DigitalRoss; 12.10.2011

На справочной странице csh указано:

Операторы foreach, switch и while, а также форма if-then-else оператора if требуют, чтобы основные ключевые слова появлялись в одной простой команде в строке ввода, как показано ниже.

а также

И foreach, и end должны появляться по отдельности в отдельных строках.

а также

Слова else и endif должны стоять в начале строк ввода; if должен стоять отдельно в строке ввода или после else.

а также

Пока и конец должны стоять по отдельности в своих строках ввода.

person Dennis Williamson    schedule 10.10.2009
comment
См. также управление потоком в статье Программирование на Csh считается вредным: faqs.org/faqs /unix-faq/shell/csh-whynot - person Philip Durbin; 23.07.2010

Я бы сказал, что я как-то исправил это, несмотря на параметры csh, поэтому вы можете сделать что-то вроде этого:

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

Я изо всех сил пытался заставить оболочку 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.

person wiredcontrol    schedule 04.09.2017