Bourne Shell 到 CShell

JuM*_*JuM 1 shell-script csh bourne-shell

这工作正常:

#!/bin/sh

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

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

但是如果我尝试将其切换到 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
Run Code Online (Sandbox Code Playgroud)

我收到一个Illegal variable错误。有任何想法吗?

ter*_*don 6

关于编写脚本,您应该知道的第一件事csh是,它通常是一个非常糟糕的主意。也就是说,如果你坚持,你的脚本的问题是:

  • csh不支持$()命令替换的构造,请` `改用。
  • csh不支持for 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
Run Code Online (Sandbox Code Playgroud)

说真的,不要写脚本csh,它只会让你痛苦。特别是因为您真正需要的是:

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