Bourne Shell para CShell

1

Isso funciona bem:

#!/bin/sh

ALTER="$1"
NAME="$2"

for pr in $(pgrep $NAME); do
    elapse=$(ps -o etime= -p $pr)
    [ "${elapse%:*}" -gt "$ALTER" ] && echo $pr
done

Mas se eu tentar mudar para o CShell:

#!/bin/csh

set ALTER = "$1"
set NAME = "$2"

for pr in $(pgrep $NAME); do
    set elapse = $(ps -o etime= -p $pr)
    [ "${elapse%:*}" -gt "$ALTER" ] && echo $pr
done

Eu recebo um erro Illegal variable . Alguma idéia?

    
por JuM 07.10.2015 / 14:06

2 respostas

6

A primeira coisa que você deve saber sobre o script em csh é que ele é geralmente um muito má ideia . Dito isto, se você insistir, os problemas com o seu script são:

  • csh não suporta a construção $() para a substituição de comando, use ' ' .
  • csh não suporta a sintaxe for i ... do ... done , use foreach i ... end .
  • csh não faz manipulação de strings como "${elapse%:*}" . Você terá que contornar isso usando alguma outra ferramenta.
  • Não sei como obter [ para trabalhar com csh (mas provavelmente é possível), como alternativa, use if .

Então, uma versão funcional do seu script em csh seria:

#!/bin/csh
set ALTER = "$1" 
set NAME = "$2" 
foreach pr  ('pgrep "$NAME"')
    set elapse = 'ps -o etime= -p "$pr" | cut -d: -f1' 
    if ( "$elapse" > "$ALTER" ) echo "$pr"
end

Falando sério, não faça script em csh , isso só causará dor. Especialmente desde que tudo que você realmente precisa é:

 ps -o pid=,etime= -p $(pgrep $NAME) | cut -d: -f1 | 
        awk -vval="$ALTER" '$2>val{print $1}'
    
por 07.10.2015 / 14:42
3

${var%$pattern} é uma construção POSIX-shell (introduzida pelo ksh) não disponível em csh .

Você pode usar expr aqui:

expr "$elapse" : '\([0-9]*\)' '>' "$ALTER" > /dev/null && echo $pr

Mas eu gostaria primeiro

  1. evite csh
  2. evite csh
  3. evite loops em scripts de shell . Aqui tudo pode ser feito canalizando ps para awk em uma sintaxe compatível com a maioria dos shells.
por 07.10.2015 / 14:37