19

for ループの実装に問題があります。スクリプトを実行すると、このエラーが発生します

test1.sh: 2: 構文エラー: ループ変数が正しくありません

このエラーがわかりません。

これは私のスクリプトです

#!/bin/bash
for (( c=1; c<=5; c++ ))
do
echo "Welcome $c times..."
done

sh(ubuntuではダッシュシェルにリンク)のforループの構文を教えてもらえますか?ubuntuのシェル?

4

4 に答える 4

36

おそらくsh、ではなく、で実行しbashます。を試すbash test1.shか、./test1.sh実行可能である場合は実行しますが、実行できませんsh test1.sh

于 2011-04-11T20:35:10.260 に答える
6

標準の POSIX シェルは構文のみを受け入れますfor varname in list

C ライクな for ループ構文for (( expr1; expr2; expr3 ))はバシズムです。

を使用して、標準の POSIX シェルで同様の動作を得ることができます。for c in $(seq 1 5)

于 2011-04-11T21:31:51.197 に答える
1

シェルスクリプト(図を参照)は、KornシェルとBashの両方で実行されます。いくつかの考え:

  • シバンの後にスペースが必要になる場合があります(#!/ bin / bashではなく#!/ bin / bash)。ただし、Dennis Ritchieは当初、スペースがオプションであると指定していました。その上、Bourneシェルで発生するエラーではありません(syntax error: '(' unexpected代わりに発生します)。
  • Windowsシステムを使用していますか?暗闇の中で刺すだけ。これはWindowsエラーのようには見えません。
  • これはSolarisまたはHP/UXシステムですか?真のバージョンのBash、または古いバージョンを実行していない可能性があります。ただし、最も古いバージョンのBashでもfor ((x;y;z))構成を認識します。

これを試して:

#! /bin/bash
set -vx
echo "Random = $RANDOM"   #Test for bash/Kornshell. Will be blank in other shells
echo \$BASH_VERSINFO[0] = ${BASH_VERSINFO[0]} #Should only work in BASH
echo \$BASH_VERSINFO[1] = ${BASH_VERSINFO[1]}
echo \$BASH_VERSINFO[2] = ${BASH_VERSINFO[2]}
echo \$BASH_VERSINFO[3] = ${BASH_VERSINFO[3]}
echo \$BASH_VERSINFO[4] = ${BASH_VERSINFO[4]}
echo \$BASH_VERSINFO[5] = ${BASH_VERSINFO[5]}
for ((c=0, c<=5, c++))
do
    echo "Welcome $c times"
done
  • set -xv実行時にすべての行が表示されます。
  • これ$RANDOMがBASHまたはKornshellの場合、は値を表示する必要があります(forループはどちらでも機能します)。
  • これ{$BASH_VERINFO[x]}が本当にBASHである場合にのみ設定する必要があります。BASHに入った後にKornシェルを実行しても、これらは設定されません($ SHELLにはまだ含まれていますbash)。

それでもforループで問題が発生する場合は、削除してください。このスクリプトのどこかで、実際にbashシェルを実行しているかどうかを確認します。

于 2011-04-11T21:25:05.953 に答える
1

何が

ls -l /bin/sh

あなたのマシンに与える?

へのシンボリックshリンクを作成するbashと、次のことができますsh ./test1.sh

于 2011-04-12T00:47:51.333 に答える