'while read line do' 結果: Linux bash スクリプトで「予期しないマーカー 'done' の近くに構文エラーが発生しました。」

'while read line do' 結果: Linux bash スクリプトで「予期しないマーカー 'done' の近くに構文エラーが発生しました。」

Solaris プラットフォームでは正常に実行されますが、Linux プラットフォームでは機能しないシェルスクリプトがあります。失敗したコードスニペットは次のとおりです。

[...]
while read line
do
insert_into_table="insert into isam_subrack_tbl (select neId, friendlyName, eqptHolderActualType from $line)"
$MYSQL_HOME/bin/mysql --socket=/tmp/mysql.sock -u$MYSQL_USER -p$MYSQL_PWD  --host $MYSQL_HOST -Demlplatform -e "$insert_into_table"
done  < isam_subrack2.txt 2> /dev/null
[...]

デバッグモードでスクリプトを実行すると、次のようになります。

bash-4.1$ sh -vvx test.sh
[...]
while read line
do
insert_into_table="insert into isam_subrack_tbl (select neId, friendlyName, eqptHolderActualType from $line)"
$MYSQL_HOME/bin/mysql --socket=/tmp/mysql.sock -u$MYSQL_USER -p$MYSQL_PWD  --host $MYSQL_HOST -Demlplatform -e "$insert_into_table"
done  < isam_subrack2.txt 2> /dev/null
test.sh: line 98: syntax error near unexpected token `done'
'est.sh: line 98: `done  < isam_subrack2.txt 2> /dev/null

コマンドを試しましたがdos2unix役に立ちませんでした。
whileループでなぜこのエラーが発生するのか知っていますか?

ベストアンサー1

問題の手がかりは次のとおりです。

test.sh: line 98: syntax error near unexpected token `done'
'est.sh: line 98: `done  < isam_subrack2.txt 2> /dev/null

2行目は通常次のとおりです。

test.sh: line 98: `done  < isam_subrack2.txt 2> /dev/null'

ご覧のとおり、エラーメッセージの後続の引用符は行の先頭にあります。これは、テキストファイルに予期しないCR文字が表示される症状です。すでにファイルを実行していることが確認されていますがdos2unix、次のように再実行することをお勧めします。

tr -d '\015' < src.sh > dst.sh

おすすめ記事