Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2832

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

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

Viewing all articles
Browse latest Browse all 2832

Latest Images

Trending Articles