Bourne Shell에서 CShell로

Bourne Shell에서 CShell로

이것은 잘 작동합니다:

#!/bin/sh

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

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

하지만 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

오류 가 발생합니다 Illegal variable. 어떤 아이디어가 있나요?

답변1

스크립팅에 대해 가장 먼저 알아야 할 csh것은일반적으로 매우 나쁜 생각입니다.. 즉, 주장한다면 스크립트의 문제는 다음과 같습니다.

  • csh$()명령 대체 구성 은 지원되지 않습니다 . 대신 사용하십시오 ` `.
  • cshfor i ... do ... done구문은 지원되지 않습니다. 대신 사용하세요 foreach i ... end.
  • csh문제 "${elapse%:*}"를 해결하려면 다른 도구를 사용해야 합니다.
  • [작업을 시작하는 방법을 모르겠습니다 csh(하지만 가능할 수도 있음). 해결 방법으로 를 사용하세요 if.

따라서 스크립트의 작업 버전은 다음 csh과 같습니다.

#!/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

하지만 심각하게 스크립트를 작성하지 마세요 csh. 고통만 초래할 뿐입니다. 특히 실제로 필요한 것은 다음과 같습니다.

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

답변2

${var%$pattern}에서 POSIX 쉘 구성(ksh에 의해 도입됨)입니다 csh.

여기서 사용할 수 있습니다 expr:

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

하지만 먼저 내가 할게

  1. 피하다csh
  2. 피하다csh
  3. 쉘 스크립트에서 루프 방지. 여기에서는 대부분의 쉘과 호환되는 구문을 사용하여 ps파이핑하여 모든 작업을 수행할 수 있습니다 .awk

관련 정보