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$()コマンド代替構成はサポートされていません。代わりに使用してください` `
  • 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}'

おすすめ記事