web-dev-qa-db-ja.com

Linuxシェルスクリプトのforループの構文

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

test1.sh:2:構文エラー:forループ変数

私はこのエラーを理解していません。

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

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

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

18
mkab

おそらく、shではなくbashで実行します。 bash test1.sh、または実行可能の場合は./test1.shを試してください。ただし、sh test1.shは試してください。

標準のPOSIXシェルは、構文_for varname in list_のみを受け入れます。

Cのようなforループ構文for (( expr1; expr2; expr3 ))はバシズムです。

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

5
Ken Bloom

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

  • シバンの後にスペースが必要になる場合があります(#!/ bin/bashではなく#!/ bin/bash)。ただし、Dennis Ritchieは当初、スペースをoptionalと指定していました。さらに、Bourne Shellで発生するエラーではありません(代わりに_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に入った後にKornShellを実行しても、これらは設定されません($ Shellにはまだbashが含まれています)。

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

1
David W.

何を

ls -l /bin/sh

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

shbashへのシンボリックリンクにすると、sh ./test1.shを実行できます。

1
abc