#環境
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」にしたのにエラーが出てしまった。
なぜだかわかる方、コメントの方でご教授願います( ; ; )