• ベストアンサー

ShellScriptの初歩

いつも初歩の質問ばかりしていて、本当に申し訳ない。でも本当に感謝しています。 また、初歩の質問です。 schellscriptで、 #! /usr/bin/sh for i in $(cat list1.dat) do gunzip -d $i done cygwin上では、問題なく動いたのが、unix上では、 syntax error at line 2: `$' unexpected と返ってきます。 どのようにすれば良いのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Lean
  • ベストアンサー率72% (435/603)
回答No.1

CygwinだからUNIXだからは関係なく使用したシェルの違いによってエラーになったりならなかったりします。 Cygwinはシェルがbashで$(command)の形式をコマンド置換として扱ってくれるのでエラーとならず正常にシェルスクリプトが動作している訳です。 なのでUNIXでもbash等$(command)をコマンド置換として扱ってくれるシェルならお書きになった内容でも正常に動作します。 しかしSolaris(このカテゴリで質問しているので)のご使用なさったシェル(/usr/bin/sh)では$(command)をコマンド置換としては扱ってくれませんのでお書きになったエラーになってます。 ○sh(1) http://docs.sun.com/app/docs/doc/819-1210/6n3j74jsj?l=ja&a=view 上記リファレンスマニュアルを見ていただくと分かりますがコマンド置換の形式は`command`になりますので、単純に質問にお書きになったシェルスクリプトを直すと ------8<------8<------8<------8<------ #! /usr/bin/sh for i in `cat list1.dat` do gunzip -d $i done ------8<------8<------8<------8<------ になります。 また、以下のような書き方も出来ます。 ------8<------8<------8<------8<------ #! /usr/bin/sh while read i do gunzip -d $i done < list1.dat ------8<------8<------8<------8<------

noname#95859
質問者

お礼

遅くなりましたが、ありがとうございます。 納得です。実は、シェルの違いもわからずに出発して、とにもかくにも、やってきた,と言う状態です。 これから、焦点を絞ってUNIXを勉強していきます。 ありがとうございました。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

#1の方の回答でいいのですが、参考にあげられた2つめの例は意味が違いますよ。質問のスクリプトや最初の例は、ファイル中の単語ごとにそれをファイル名としてgunzipしますが、2つめの例はファイルの1行ごとに処理をしてファイル名と見なすので1行に複数ファイル名が書いてあると動作が違ってきます。

noname#95859
質問者

お礼

コメントありがとうございます。 皆さんのお陰で、本当に勉強のスピードが上がっています。ありがとうございます。