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
错误。有任何想法吗?
关于编写脚本,您应该知道的第一件事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)