Bashスクリプトは、「予期しないトークン '完了'の近くに構文エラーが発生しました」を生成します。

Bashスクリプトは、「予期しないトークン '完了'の近くに構文エラーが発生しました」を生成します。

シェルスクリプトは次のとおりです。

#!/bin/bash
while [ true ]; do
    clear
    date
    who
    sleep 5
done 

intを実行すると、次のような結果が得られます。

yuikus@DESKTOP-VTJ0OG4:~$ cd /mnt/d/lab_oc_1/lab_oc_2/
yuikus@DESKTOP-VTJ0OG4:/mnt/d/lab_oc_1/lab_oc_2/$ sh bag.sh
bag.sh: 7: Syntax error: "done" unexpected (expecting "do")
yuikus@DESKTOP-VTJ0OG4:/mnt/d/lab_oc_1/lab_oc_2/$ bash bag.sh
bag.sh: line 7: syntax error near unexpected token `done'
bag.sh: line 7: `done '

なぜ動作しないのですか?私はWindowsでUbuntuを実行しています。

答え1

WindowsでUbuntuを実行しているので、おそらくWindowsとLinuxの両方のエディタを使用してスクリプトを編集します。ただし、WindowsとLinuxでは異なる行ターミネータが使用されるため、スクリプトインタプリタが混乱する可能性があります。

dos2unixスクリプトファイルを実行すると、Windows(CR-LF)行末がUnix行末に置き換えられます。

$ dos2unix bag.sh

次に、元の意図したとおりにスクリプトを実行します。#!-line宣言があるので、/bin/bashスクリプトを実行可能にし、次のように実行する方が合理的です。

$ ./bag.sh

Bashで実行する代わりに、目的のシェル以外のshシェルを使用することもできます。

関連情報