• 締切済み
  • 困ってます

getoptsの使い方を教えてください

sh組み込みのgetoptsではなく、/bin/getoptsをcshスクリプトの中で使用してみようと試みmanを読んでみたのですが上手く動作せず、getoptsの使用方法を教えて頂きたく思っています。 例として、optionを -a -b <file> のようにaと引数を取る-bを使用することが出来るような場合に関して具体的にスクリプトはどのようになるのでしょうか? イメージとしてはcshで以下のようなものになるかと思われます: #! /bin/csh -f set noglob set mode_a = "" set mode_b = "" set mode_b_file = "" while ($#argv) switch ($1) case -a : set mode_a = 1 breaksw case -b : set mode_b = 1 if($#argv >= 2) then shift set mode_b_file = $1 else echo "[Error]: -b is followed by <file_name>" exit 1 endif breaksw default: echo "[Warning]: ignored option $1" endsw shift end echo "option a is $mode_a b is $mode_b b_file is $mode_b_file" exit 0 以上宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数389
  • ありがとう数1

みんなの回答

  • 回答No.2

先調べたですけど 「getopts sh and bash builtin. Easier to use and generally better than getopt, though of course not available in csh-like shells. 」 というわけで cshでgetoptsは使えないみたい。。。。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

お返事遅くなりました。 分かりました、cshでは使えないとのこと、認識しました。 どうも有難うございました。

関連するQ&A

  • UNIXでテキスト→PS→印刷なコマンド

    UNIXを勉強中です。 テキストファイルをPSファイルにして、すぐに印刷してくれるようなUNIXスクリプトを書いたつもりなのですが、どうもうまく行きません。 どこが間違っているのでしょう。 ちなみにプリンタはlp4160です。 #!/bin/csh -f if($#argv != 1)then echo "テキストファイルをPSファイルにして印刷します。" echo "ファイル名を指定します。" exit 1 endif a2ps -f9.8 $1 | lpr -Plp4160

  • Cシェルスクリプトで二重引用符をechoする

    Cシェルスクリプトで二重引用符をecho するにはどうしたらよいのでしょうか(できるのでしょうか)? エスケープ 「 \" 」のようなエスケープではダメでした。 変数展開をしたいので、一重引用符「'」で括るのではない方法が好都合です。 「VAR is "okwave"」 という出力を得るための同等のスクリプト例(冗長?): #! /bin/csh -f set VAR = "okwave" echo -n "VAR is " echo -n '"' echo -n "$VAR" echo '"' 宜しくお願い致します。

  • system関数で呼びだした、cshファイル周辺でのエラー

    2~3日前にも質問させていただいた、Perl初心者leeeeeeeeです。先日に引き続き、前の業者が作ったPerlプログラムを、新しいサーバ上で動くようにする作業を行っているのですが、まだエラーが出ており困っています。以下が問題の部分です。 ○○.cgi # 削除シェルの実行 $rtn = system"$rm_csh $tmp_file $limit_date $touch_file"; if($rtn != 0) {  # エラーログ出力  cm_errlog(__FILE__, "LOG013", ($rm_csh." ".$limit_date));  # エラーHTML出力  省略  # 異常終了  exit 1; } ここの、$rtnが、0になっていないようで、エラーページが表示されてしまいます。 ちなみに、$rm_csh は、tmpdel.cshというファイルで、以下が中身です。 ■ tmpdel.csh #!/usr/bin/csh set touch_fname = $3 set tmp_file = $1 touch -t $2 $touch_fname >& /dev/null set STS = $status if( $STS != 0) then exit 1 endif foreach file_name (`ls $tmp_file*`)  test $file_name -ot $touch_fname && rm $file_name >& /dev/null end exit 0 ■ tmpdel.csh の #!/usr/bin/csh という部分が気になって、#!/usr/bin/perlとか、 #!/bin/cshにもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • 回答No.1

個人的にcshはあまり好きじゃないですけど。。。 cshを使いたい場合は set argv = (`getopt abf: $*`)

共感・感謝の気持ちを伝えよう!

質問者からの補足

有難うございます。 getoptではなくgetoptsを使用した場合はどのようになりますでしょうか?両者は引数のとり方が違うようで、上記getoptの部分をgetoptsにしただけではやはり上手く行きませんでした。 以上引き続き宜しくお願い致します。

関連するQ&A

  • CSHの環境変数の設定

    CSHで外部で定義したconfigファイルから変数を読み込み そのシェル及び子シェル内で有効な変数として使用したのですが どのような方法がありますでしょうか? 以下の方法だと親シェルからでは子シェルで設定した変数が読み込めないため困っています。 config.csh #!/bin/csh -f setenv AAA aaa test.csh #!/bin/csh -f set APP_ROOT = `dirname $0` cd $APP_ROOT set CONFIG_FILE=$APP_ROOT"/config.csh" echo $AAA

  • NTのバッチを会話形式にしたい

    WindowsNT4.0(SP6)で、バッチファイルを作ろうと思っています。 会話形式で標準入力からの入力待ちで処理を止めたいのですが、どうしたらいいのでしょうか? Solarisなら下のような感じなのですが、Windowsではどうやったらいいのかわかりません。 どうか教えてください。 Solaris(csh)の場合・・・ #!/bin/csh echo -n "年齢入力" set innum=$< # if ($innum < 19)then echo "あなたは成人ではありません" else echo "あなたは成人です" endif exit

  • csh(Cシェル)のevalに関して

    evalを用いてインクルード的な事を行いたいのですが、「コマンドが見つかりません」が出てきて困っています 原因はなにがあるのでしょうか? 色々ネットで調べて同じように記述したつもりなのですが csh初心者で申し訳ありませんが 使い方が悪いのか、環境が悪いのか?判断できません 環境は別の人に作って貰ったんで、環境なら環境から勉強していきたいと考えてます ■TEST010.csh #!/bin/csh echo "TEST010-Step0010" eval `./TEST000.csh` echo "TEST010-Step0020" echo " set root_path $root_path;" echo "TEST010-Step0090" ■TEST000.csh #!/bin/csh set lcmoji01 = /export/home/tbn/km echo "set lcmoji01 $lcmoji01;" ■実行結果 > csh TEST010.csh TEST010-Step0010 ^M: コマンドが見つかりません。 TEST010-Step0020 lcmoji01: 未定義の変数

  • 変数$importfileに第1引数($1)のファイルPATHを表示したい

    下記のスクリプトを書きましたが ./aa.sh: line 6: =/tmp: command not found と言われるのはなぜですか? 変数$importfileに第1引数($1)のファイルPATHを表示したいです。 1 #/bin/bash 2 3 echo $# 4 if [ $# -eq 1 ] 5 then 6 $importfile=$1 7 echo "$importfile" 8 else 9 echo "argv file notfound" 10 exit; 11 fi 12 実行結果 ./aa.sh /tmp 1 ./aa.sh: line 6: =/tmp: command not found

  • UNIX Cシェルで実数の比較

    UNIX Cシェルで実数の比較がしたいのですが、 うまくいきません 以下のような結果になります。 うまく判定するにはどうすればよいのでしょう #!/bin/csh -f set CONSIZE=-0.01 echo "CONSIZE = $CONSIZE" @ CONSIZE = $CONSIZE if( $CONSIZE < 0.0 )then echo " 0以下;;; $CONSIZE" exit endif 実行 CONSIZE = -0.01 @: 数値形式が正しくありません。

  • cshからperlを呼び出しファイルに出力

    いつもお世話になっております。 cshからperlを呼び出しperlが出力する内容と入力項目を実行しているcsh内部で行ない結果をファイルへ出力したいのですが、そのような事ができるのでしょうか? ---------- cshファイル内 #!/bin/csh echo "●perl a.pl を実行します" | tee a.log perl a.pl ---------- perlファイル内 (perlがわかりませんので、perlの内容をcsh形式で記述させていただきます) (1)echo -n "日付を入力して下さい" (2)echo "⇒ " (3)set INPUT_DATE = $< (4)echo "日付:$INPUT_DATE " exit 0 ---------- cshから実行されたperl(csh)の内容[(1)(2)(3)(4)]をファイル(| tee a.log)へ出力することが可能でしょうか? ご存知の方がいらっしゃいましたらご教授願います。

  • echoの出力は標準エラー出力ですか?

    例えばsamp.cshのようなc-shellスクリプトを作成、 samp.csh | less のようにすると、echoの行が表示されないのに対して samp.csh |& less とすると表示されました。 echoは例によって色々なバージョンがありそうですが、man を見る限りechoの出力に関して特別な記述が有りません。 echo is a shell built-in /usr/local/bin/echo /bin/echo /usr/bin/echo /usr/ucb/echo echoコマンドはデフォルトで標準エラー出力なのでしょうか?これを標準出力にするオプションは無いのでしょうか?もしくはどのエコーを使うと解決するのでしょうか? --[samp.csh] #! /bin/csh -f foreach a ($aa) echo "$a" diff $work/$a $TRY1_CENTER/syn/ end システム Release: 5.7 Kernel architecture: sun4u Application architecture: sparc Kernel version: SunOS 5.7 Generic 106541-17 June 2001

  • シェルスクリプトの内容の確認

    Solarisのスクリプトについて教えてください。 以下のスクリプトファイルが登録されており、その内容の詳細を確認したいと思っております。 (1) 5行目の "$1" は何を意味しているのでしょうか? (2) 12行目の 「echo 」文内に「{ start | stop }」と記述がありますが、この start / stop はどの情報を元に判断して結果が出力されるのでしょうか? (3) 12行目の 「echo 」文のコマンドの後に、13行目「exit 1」と14行目「;;」がありますが、 これはどちらの行でcase文を抜けるということになるのでしょうか? ========================================================================================= #!/bin/sh # # /etc/init.d/nodemanager.sh # case "$1" in start) if [ -f /home/bea81/weblogic81/server/bin/startNodeManager.sh ] ; then /bin/su - weblogic -c 'cd /home/bea81/weblogic81/server/bin;./startNodeManager.sh &' fi ;; *) echo "Usage: /etc/rc2.d/S99nodemanager{ start | stop }" exit 1 ;; esac exit 0 ========================================================================================= よろしくお願いいたします。

  • cshのエラー、どういうこと?

    シェルスクリプトはまったくの初心者です。 書籍についてきたCDに入っていたシェルスクリプトを実行させようとすると、次のエラーが出ます。 'nkown option: `- Usage: csh [ -bcdefilmnqstvVxX ][ agument ...]. そのスクリプトの出だしはこんな感じです。 #! /bin/csh -f if ($2 == "") goto nosize if ($2 == "n") catsiz n d $2 $1 if ($2 == "n") catsiz n d $2 sfstor if ($2 == "s") catsiz s d $2 $1 if ($2 == "s") catsiz s d $2 sfstor ・ ・ web上の入門サイトなどにあるのを参考に #! /bin/csh -f echo "you typed $1." というようなのを作ってみたら、これはちゃんと動きます。 パスの設定等にも問題はないと思っているのですが… どなたかこのエラーを回避する方法を教えてください。

  • cshのパス名指定子

    cshプログラムの :t(:gt, :h ...)などパス名指定子の仕様に関して教えて頂きたく思い投稿いたしました。 これらの演算子はフルパス表示からフアイル名部の文字列を 取り出す際に(/bin/ls-->ls)単に最後のスラッシュより前の部分を省略するという処理ではないのでしょうか? 例1のような場合はOKなのですが例2のような場合は利かないのです!! 変な引数を与えられた場合にバッチスクリプトの使い方をechoするところで$0を使いたいのですが、このコマンドはどのような場所から実行されるか分からないので、:t を用いてバッチファイル名だけを表示させたいと思っています。 [1: OK例] set qqq = (/opt/sfw/etc/* ) echo "$a:gt" -<結果>--- enscript.cfg esd.conf fnrc ftpaccess ftpconversions ... [2: NG例] test.csh #! /bin/csh -f echo "usage of $0:t" --<結果> --- usage of /export/home/matumoto/study/csh/dirFlag.csh:t 以上、宜しくお願いいたします。 ※ 作業はsolaris 8で行っています。