LoginSignup
0
0

More than 1 year has passed since last update.

Ubuntuシェルスクリプトのループ処理で Syntax error:"(" unexpectedが出たときの備忘録

Posted at

環境

VirtualBox:6.1.22
Ubuntu:20.04.2 LTS
bash: 5.0.17

やっていたこと

Linux(Ubuntu)の環境でループ処理を行うシェルスクリプトを作成していた。
しかし配列の代入部分に「Syntax error:”(”unexpected」が出てしまった。

#ファイル名(loop.sh)

#!/bin/sh
info=(book website article)
for media in "${info[@]}"
do
echo $media
done

==結果==
./loop.sh: 3: Syntax error: "(" unexpected

原因

シェルスクリプトの最初の行にて「#!/bin/sh」と書いていたのがまずかったらしい。

ちなみにこのソースコードは「bash <ファイル名>」で実行できるとのこと。

bash loop.sh

つまり上記のコードの場合は「bash loop.sh」でエラーは出ずに実行できた。

参考サイト:シェルスクリプトで『Syntax error: "(" unexpected』とかなった場合のメモ

解決方法

「bashコマンド+ファイル名」で実行できたものの何かもやもやする。ということで、試行錯誤で一番上の宣言の部分を「#!/bin/bash」に直したところエラーは出ずにコードは稼働した。

#ファイル名=loop.sh
#!/bin/bash
info=(book website article)

for media in "${info[@]}"
do
echo $media
done

#==結果==
book
website
article

なるほど、一番上の宣言はコメントとしてだけでなくコンパイラへの指示(疑似命令?)として扱われるのかと推測。

推測

自分がどのシェルを利用しているのか調べてみた。

echo $SHELL
/bin/bash

どうやら現在のシェルはbashを利用しているみたい。

だからシェルスクリプトファイルの一番上の疑似命令には"#!/bin/bash"と記載しないと動かないのか?

ファイルの先頭の疑似命令に”/bin/sh”としている場合は"sh"環境で動くと前提されているファイルだから、あえてファイルの実行時には「bash ファイル名」というようにBash宣言をしなければいけないのかと思った。

仮説をもとに、疑似命令を「#!/bin/sh」にして環境変数SHELLを「sh」にして実行してみた。

echo $SHELL   #現在のシェルを確認
/bin/bash 

export SHELL=/bin/sh   #シェルをshに変更

cat loop.sh    #ファイルの中身を確認
#!/bin/sh

info=(book website article)
for media in "${info[@]}"
do
echo $media
done

./loop.sh #shシェルにてファイルの実行
./loop.sh: 3: Syntax error: "(" unexpected

あれ。。
エラーが出た。。
環境変数SHELLを「sh」にしてファイルの宣言に「#!/bin/sh」にしたのにエラーが出てしまった。

なぜだかわかる方、コメントの方でご教授願います( ; ; )

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0