2

tcsh を介して IF ステートメントを実行する際に問題が発生しました。これは私にとってはうまくいきます-

#!/bin/bash
if echo `cal|tail -6|sed -e 's/^.\{3\}//' -e 's/.\{3\}$//' |tr -s '[:blank:]' '\n' | head -11|tail -10|tr -s '\n' ' '`|grep -w `date "+%e"`
then
        echo "present"
else
        echo "absent"
fi

これが問題です -

#!/bin/tcsh
if echo `cal|tail -6|sed -e 's/^.\{3\}//' -e 's/.\{3\}$//' |tr -s '[:blank:]' '\n' | head -11|tail -10|tr -s '\n' ' '`|grep -w `date "+%e"`
then
        echo "present"
else
        echo "absent"
endif

このエラーを取得する -

if: Expression Syntax.
then: Command not found.

「tcsh」を使用して実行するには、これが本当に必要です

4

3 に答える 3

3

まず、次の 2 つの異なるシェル ファミリを見つけることができることを知っておく必要があります。

  • Bourne タイプのシェル (Bash、zsh...)
  • C 構文型シェル (tcsh、csh...)

ご覧のとおり、Bash と tcsh は同じシェル ファミリに属していません。このため、tcsh では if ステートメントが bash のものとは少し異なります。あなたの場合、キーワード「then」が間違っています。「if」行の最後に次のように配置してみてください。

#!/bin/tcsh
if(echo `cal|tail -6|sed -e 's/^.\{3\}//' -e 's/.\{3\}$//' \
|tr -s '[:blank:]' '\n' | head -11|tail -10|tr -s '\n' ' '`| \
grep -w `date "+%e"`) then
     echo "present"
else
     echo "absent"
endif

それが役に立てば幸い。

于 2012-11-14T10:49:52.547 に答える
0

これは、POSIXスタイルのシェルのステートメントが常にコマンドを実行することによって機能するbashために機能します(そして、それがコマンドのエイリアスであることが起こります)。if[test

ただし、のifステートメントはtcshそのようには機能しません。それらには独自の構文があります(tcshマニュアルページの式で説明されています)。

パイプラインを単独で実行してから、if:で終了ステータスを確認してみてください。

cal | tail -6 | sed -e 's/^.\{3\}//' -e 's/.\{3\}$//' | tr -s '[:blank:]' '\n' | head -11 | tail -10 | tr -s '\n' ' ' | grep -w `date "+%e"` >/dev/null
if ( $? == 0 ) then
    echo "present"
else
    echo "absent"
endif
于 2012-12-17T20:43:45.307 に答える
0

私は通常、条件ステートメントを単純に保ちながら、このようなことを行います。ただし、「if」に変数を詰め込んで、grep が空でないことを確認するだけでかまいません。

set present = `tail -6 .... | grep “”`

if ( $present != “” ) then
   echo “present”
else
   echo “not present”
endif 

「-x」を使用して #!/bin/tcsh -x をデバッグすることもできます。変数をチェックするためのこの小さなことは、エコーで行う必要がありますが、「-x」を使用すると、必要なすべての情報が得られる場合があります。

于 2017-12-19T13:43:57.473 に答える