Как использовать для циклов в командной строке в оболочке csh - поиск приличных лайнеров - PullRequest
4 голосов
/ 09 октября 2009

из оболочки bash, я пропустил лёгкое сворачивание циклов (потому что я в (...); делаю ... сделано;)

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

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

Ответы [ 4 ]

10 голосов
/ 10 октября 2009

Страница man csh сообщает:

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

и

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

и

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

и

while и end должны отображаться отдельно в своих строках ввода.

2 голосов
/ 09 октября 2009

Ух ты, я не писал 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 аккуратно повторяет эту структуру данных.

1 голос
/ 21 марта 2015

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

printf "while ( 1 ) \n ps -aux|grep httpd \n echo 'just a new row' \n  sleep 2 \n end" | csh -f
0 голосов
/ 04 сентября 2017

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

    $> 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 выполняются в цикле.

...