これはうまくいきます:
#!/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
$()
コマンド代替構成はサポートされていません。代わりに使用してください` `
。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
しかし、真剣にスクリプトを書かないでくださいcsh
。痛みだけを招くだけです。特に実際に必要なものは次のとおりです。
ps -o pid=,etime= -p $(pgrep $NAME) | cut -d: -f1 |
awk -vval="$ALTER" '$2>val{print $1}'