• ベストアンサー

ShellScriptの初歩

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

noname#95859
noname#95859

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

  • ベストアンサー
  • 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% (4848/10262)
回答No.2

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

noname#95859
質問者

お礼

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

関連するQ&A

  • perlと引数 その結果はshellscript

    今、仕事で、UNIXの知識もないまま、突入しています。 教えてください。 perlのプログラムに引数を与え、perlで処理した内容を shellScriptにしようとしています。 #! /usr/bin/sh myProgram.pl "mytest" > mytest.sh どうもうまく行きません。どうすればよいですか? よろしくお願い致します。

  • ファイルから文字列を読み込むシェルスクリプトの作成

    現在シェルスクリプトの勉強をしています。 ファイルから文字列を読み込み表示するだけのシェルスクリプトを 作成しているのですが、エラーが出てうまくいきません。 ./test.sh: line 10: syntax error near unexpected token `done' 以下の通りファイルを作っています。 改行コードはLF、文字コードはSJISとなっています。 どのあたりが間違っているのか教えて頂けますでしょうか。 よろしくお願いします。 test.sh --------------------- #!/bin/sh LIST=./abc.lst while read F1 echo ${F2} break done < ${LIST} } --------------------- abc.lst --------------------- AAA BBB CCC ---------------------

  • cygwin上でcat、uniqコマンドが使えない

    cygwin上でls、more等は使えるのに、cat、uniqコマンドが使えません。/usr/binにもこのコマンドは無いです。使えるようにする方法を教えてください。

  • 自動パスワード入力でscpするスクリプトでエラー「Unterminated quoted string」

    Win2kのCygwinで下記のスクリプトを試してみました。 (ローカルのファイルをscpで自動転送) $ uname -a CYGWIN_NT-5.0 upsil 1.5.11(0.116/4/2) 2004-09-04 23:17 i686 unknown unknown Cygwin $ cat ./test.sh #!/bin/sh HOST=192.168.1.105 # scp するマシン名を設定 UNAME=user01 # ログイン名を設定 PASSWD=xxxxxxxx # パスワ-ドを設定 TARGET=/cygdrive/c/cygwin/home/root/hoge /usr/bin/zip -r $TARGET.lzh $TARGET expect -c " # expect コマンドを実行 set timeout 20 spawn scp -P 60001 $TARGET.lzh $UNAME@$HOST:/home/fat32/ # expect コマンドの管理下でscpを実行する expect login:\ ; send \"$UNAME\r\" # login: が出たらログイン名を打ち込む expect sword:\ ; send \"$PASSWD\r\" # password: が出たらパスワ-ドを打ち込む #expect \"$\" ; send \"ls\r\" # $ が出たら ls を打ち込む #expect \"$\" ; send \"exit\r\" # $ が出たら exit を打ち込む $ which expect /usr/bin/expect $ which zip /usr/bin/zip $ ./test.sh と実行すると : 9: Syntax error: Unterminated quoted string となり、終ってしまいました。 「expect -c " # expect コマンドを実行」 が問題みたいなのですが何がまずかったのでしょうか?

  • シェル変数(path)の挙動がわかりません

    シェル変数の挙動がわからなくて困っています。 以下のような3ファイルがあります。 % cat /tmp/test_config.sh #!/opt/local/bin/zsh path=($path /tmp) % cat /tmp/test.sh #!/opt/local/bin/zsh . /tmp/test_config.sh echo $PATH echo $path /tmp/test2.sh % cat /tmp/test2.sh #!/opt/local/bin/zsh echo $PATH echo $path which test.sh これを、所有者のユーザで実行するのとsu -c で実行するので挙動が変わります。 % /tmp/test.sh /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/opt/local/sbin:/tmp /usr/bin /bin /usr/sbin /sbin /usr/local/bin /opt/local/bin /opt/local/sbin /tmp /tmp/test.sh % sudo su - hogehoge -c /tmp/test.sh /bin:/usr/bin:/usr/ucb:/usr/local/bin:/tmp /bin /usr/bin /usr/ucb /usr/local/bin /tmp /bin:/usr/bin:/usr/ucb:/usr/local/bin /bin /usr/bin /usr/ucb /usr/local/bin test.sh not found この挙動の違いは、何から産まれるんでしょう? .zshrc でそういう設定ができるんでしょうか? .zshenv は使ってません。 (なお、環境変数$PATHを使えば目的は果たせると言うのはわかっています)

  • make時に...

    いつも、お世話になります。 本日も、また初歩的なことだとは思いますが、よろしくお願い致します。 SunOS5.8の初期インストール状態から、 sunsiteから拾ったgccとmakeをpkgaddしました。 それから、curl、apacheをインストールしようと思いconfigureし、gmakeしたところ、両者とも同じような(下記)ところでerrorがでます。 どなたかご教授ください。 /usr/ccs/bin/as: "/var/tmp/cc4T0vmL.s", line 1038: error: unknown opcode ".subsecsion" /usr/ccs/bin/as: "/var/tmp/cc4T0vmL.s", line 1038: error: statement syntax /usr/ccs/bin/as: "/var/tmp/cc4T0vmL.s", line 1048: error: unknown opcode ".previous" /usr/ccs/bin/as: "/var/tmp/cc4T0vmL.s", line 1048: error: statement syntax

  • unix.linuxのシバンについて

    UNIX・ Linux初心者です。 現在シェルについて学習している所です。 そこで質問なのですが、シェルスクリプトの1行目にシバンと呼ばれるものを書きますよね? #!/usr/bin/sh や #!/bin/shといったような。 この二つそれぞれ同じ実行結果を返してくれるんですが、/usrの有無の違いが分からないんです。 /usrを付けている時と付けていない時の違いを教えていただけないでしょうか?回答お願いします。

  • コマンド

    以下のシェルスクリプトをパイプ等をつかって1行のコマンドで簡潔に書きたいとき、どう書けばいいでしょうか? $ ./test.sh src dst -- test.sh ---------------- #! /bin/bash src=$1 dst=$2 for i in $(cat ./files) do  何かのコマンド $i $1 $2; done; これを1行のコマンドで書くとしたら??

  • わからないエラーが出て困っております。

    Mac OS X 10.4.11を使っております。 /bin/sh: line 1: /usr/bin/dscacheutil: No such file or directory というエラーが出る場合はどうしたらいいのでしょうか...本当に全然わからない初心者で困っております。

    • ベストアンサー
    • Mac
  • dvioutの「Cannot resolve Fonts」エラーを解決

    dvioutの「Cannot resolve Fonts」エラーを解決できません(涙) dviout を Windows 7 Professional (64bit) に入れました。 dviファイルを読み込むと、一部のファイルで、 「Cannot resolve Fonts」 というエラーが出ます。 不思議なのは、全てのファイルではなく一部のdviファイルだけでエラーが出るということです。 エラーは出るのですが、ちゃんと表示されているようにも思えます。 dvioutでは以下の情報が表示されています。 ------------------------- line10.300(1500): Searched c:\cygwin\usr\local\tex\share\texmf\fonts\tfm\\line10.tfm Searched c:\cygwin\usr\local\tex\share\texmf\fonts\pk\\line10.300pk Searched c:\cygwin\usr\local\tex\share\texmf\fonts\pk\\line10.301pk Searched c:\cygwin\usr\local\tex\share\texmf\fonts\pk\\line10.299pk Searched c:\cygwin\usr\local\tex\share\texmf\fonts\vf\\line10.vf Searched c:\cygwin\usr\local\tex\share\texmf\fonts\ovf\\line10.ovf Searched c:\cygwin\usr\local\tex\share\texmf\fonts\tfm\\line10.tfm Searched the above ------------------------- http://akagi.ms.u-tokyo.ac.jp/dvioutQA.html​ を読んで格闘したのですが・・・解決しませんでした。 絶望的でしょうか? ●使用しているのは角藤さんのW32TeXとdvioutです。 cygwinをインストールした後、 ・c:\cygwin\usr\local\tex に角藤さんのW32TeX ・c:\cygwin\usr\local\dviout にdviout をインストールしました。 ●%TEMP% %TMP% とも C:\Users\私\AppData\Local\Tempです。 ●PATHの順番は、前から (1) c:\cygwin\usr\local\tex\bin ← 角藤さんのW32TeX (2) c:\cygwin\usr\local\tex\dviout ← dviout (3) C:\cygwin\usr\local\bin;C:\cygwin\bin ← cygwin です。 ●dvipsk はうまくいきます。 --- Environment --- C:\cygwin\usr\local\tex\dviout\dviout.exe dviout : Ver 3.18.1 (July 20, 2006) OS : WindowsXP Version 6.1 (4 日本語 (日本)) comctl32.dll : Version 5.82 shell32.dll : Version 6.1 printer : Canon MF4360-4390 monochrome(600dpi) TeX 3.1415926 (Web2C 2009) pTeX 3.1415926-p3.1.11 (sjis) (Web2C 2009) dvips(k) p1.7b GPL Ghostscript 8.70 (2009-07-31) TEXMF="" TEXMFMAIN="" TEXMFCNF="" GS_LIB="" PATH="C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\ImageMagick-6.5.7-Q16;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v 1.0\;c:\cygwin\usr\local\tex\bin;c:\cygwin\usr\local\gs\gs8.70\bin;c:\cygwin\us