-1

コードが1行ずつファイルを読み取るスクリプトがあります

FILE=commands.txt
while read CMD; do
    echo "$CMD"
done < "$FILE"

このコードはスクリプトファイルvxm_alarm.shに保存されます。Kornシェルでは、コマンドを実行すると、このループは完全に機能しますvxm_alarm.sh。ただし、bashでは次のエラーが発生します

vxm_alarm.sh: syntax error at line 4: `done' unexpected

Bashでは、コマンドを使用してスクリプトを実行していますsh vxm_alarm.sh。私は何が間違っているのですか?そして、なぜこれをbashで実行するだけでスクリプトを実行できないのですか?

chmod +x filename.sh
filename.sh
4

3 に答える 3

1

あなたのコードは、GNU bash 4.1.5 を使用して私のマシンで動作します

一番上にシバンを追加してみてください:

#!/bin/sh
FILE=commands.txt
while read CMD; do
    echo "$CMD"
done < "$FILE"
于 2012-04-16T10:50:01.853 に答える
0

実行するsh vxm_alarm.sh場合は、おそらく Bash を実行していません。試してみてくださいsh --version- バージョン文字列以外のものを取得した場合、それはBashではありません。bash vxm_alarm.sh代わりに実行してみてください。

パスなしでスクリプトを実行できるようにするには、PATH変数にリストされているディレクトリのいずれかにある必要があります。たとえば、

echo "$PATH"

版画

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

、、、、またはを入れfilename.sh/usr/local/sbin、単純に実行することができます。パスにないディレクトリからスクリプトを実行する場合は、次の 3 つの選択肢があります。/usr/local/bin/usr/sbin/usr/bin/sbin/binfilename.sh

  1. $PATHスクリプトが存在するディレクトリを含めるように変更します。
  2. 相対パスまたは絶対パスで実行します。
  3. 相対パスまたは絶対パスを指すエイリアスまたは関数を作成します。
于 2012-04-16T11:21:02.003 に答える
0

あなたの質問のこの部分に答えたいと思います:

bashでこれを行うだけでスクリプトを実行できないのはなぜですか

chmod +x filename.sh
filename.sh

他の人がすでに部分的に指摘しているように、それが機能するにはいくつかのことが必要です。

  1. 実行権(chmodコマンドで確認しました)
  2. シバン、システムは使用するシェル/インタープリターを認識します

    #!/bin/bash
    

    ( shではなく bash が必要な場合は、 bash と言うこと重要です)

  3. コマンドが見つかったことを確認してください。これは、そのディレクトリが にある場合PATHです。ただし、この場合は、ディレクトリを指定することをお勧めします。現在のディレクトリの場合、次のようにすることができます

    ./name-of-the-script
    

    DOS や (IIRC) のさまざまな Windows コマンド ライン インターフェイスとは対照的に、Unix システムでは通常、PATH. 追加することは可能ですが、セキュリティに重大な影響があるため推奨されません。

于 2012-04-17T04:54:54.287 に答える