初心者なので、あまり理解していませんが、
シェルスクリプトからCOBOLソースをCALLして、
COBOLでのリターン値を取得したいのですが、
一度に複数のリターン値を取得できるのでしょうか?

このQ&Aに関連する最新のQ&A

COBOL とは」に関するQ&A: COBOLのPtoPとは?

bash 意味」に関するQ&A: bashの意味

A 回答 (3件)

>例えば、シェルからCOBOLプログラムをCALLして、


>COBOLプログラムで得た、日付と金額をシェルに返したい場合は、どのように行えばよろしいでしょうか?
そういうのは、リターン値と言わず、処理結果などと言います。

COBOLプログラムで
(前略)
1 OUT-DATA.
 5 HIZUKE PIC X(10).
 5 FILLER PIC X VALUE SPACE.
 5 KINGAKU PIC 9(8).
(中略)
 MOVE '2005/04/22' TO HIZUKE.
 MOVE 1050 TO KINGAKU.
 DISPLAY OUT-DATA.
(後略)
シェルでは、種類によって違いますが、プログラム名をcblpgmとして、
(1) sh の場合
set -- `cblpgm`
echo 日付け=$1 金額=$2
(2) bash の場合
A=(`cblpgm`)
echo 日付け=${A[0]} 金額=${A[1]}
(3) csh の場合
set a=(`cblpgm`)
echo 日付け=$a[1] 金額=$a[2]
    • good
    • 0

リターン値(戻り値)は1つしかありません。



で呼ばれた方から呼び元へ複数の値を返す考え方は2つあります。
1つは、複数の値を一定の規則で1つに合成して
リターン値として返し、
呼び元で元に戻すという方法です。

もう1つは、引数のアドレス渡し・・・。
(普段、無意識で行っているのは値渡しと言います。)
返して欲しい値を設定して欲しい変数のアドレスを引数として渡す方法です。
COBOL は、変数のアドレス指定が出来たはずなので・・・。
ただ、シェルスクリプト側で変数のアドレスが使えたかはちょっと知識不足で・・・。
    • good
    • 0

プログラムのリターン値って元々1つしかありません。


「複数のリターン値」ってどういう意味でしょう?
COBOLの場合、リターンコードは、
MOVE 1 TO RETURN-CODE.
のように特殊変数に整数値をセットし、それをシェルでは $? という特殊変数で参照します。

何か複数の処理結果を得たいなら、リターンコードではなく、標準出力に文字列で書き出してそれを使うんでしょうね。

この回答への補足

早速のご回答、ありがとうございます。
記述が悪くて申し訳ありませんでした。
細かい話になってしまいますが、
例えば、シェルからCOBOLプログラムをCALLして、
COBOLプログラムで得た、日付と金額をシェルに返したい場合は、どのように行えばよろしいでしょうか?

補足日時:2005/04/22 02:45
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qシェルスクリプトで配列が使えない

シェルスクリプトを利用するときに変数を配列として扱えるという記述を見たので、
以下のようなシェルスクリプトを作成したのですが、エラーが出てきてしまいます。
端末で直接入力すると、正しく動作します。そのためなぜエラーとなるのかわかりません。

環境はubuntu 10.10、
GNU bash, バージョン 4.1.5(1)-release (i686-pc-linux-gnu)
です。


----------------------
#!/bin/sh

list=(`ls`)
echo ${list[0]}
----------------------

3:Syntax error: "(" unexpected

Aベストアンサー

ディストリビューション等によっては、 shがbashへのリンクになっている場合もあります。その場合、質問のスクリプトで動作します。

が、どうやら、あなたの環境ではshは拡張されていない元々の B-sh相当のもののようです。
配列はB-shそのものには無く、ksh,bash等の拡張版でのみ使えます。

#!/bin/bash

にしたら動くのではないでしょうか。(bashのパスが違っていたらそれに合せて)


> シェルスクリプトを利用するときに変数を配列として扱える

シェルスクリプトにも大きく B-shとC-shがあり、それぞれに本来の仕様(sh,csh)と、拡張版(ksh,bash,zsh,tcsh等)があります。
それぞれで詳細が違いますので、単純に考えないようにしましょう。

QアセンブラソースをCOBOLソースに自動変換

アセンブラソースをCOBOLソースに自動変換するようなソフトは有るのでしょうか。

Aベストアンサー

実行ファイルからソースを作成するソフトは、ディスコンパイラ(逆コンパイラ・デコンパイラとも)と言うものです。

javaだとディスコンパイラが存在し、割合実用になるっぽいですが、COBOLでは存在自体が厳しいですね…Cだったら探せばディスコンパイラはありますけど、x86以外の処理系ではなかなか厳しいと思います。No2の回答者さんからも指摘がありますが、処理系が何かをはっきりさせないと、一般論的回答しか付かない(それしかできない)と思いますよ。

Qシェルスクリプト複数の配列を使用したループ処理

bashシェルスクリプトの素人です。

IPアドレスを1行に1つずつ記したファイル IP.txt と、IDを1行に1つずつ記したファイル ID.txt があります。
これらのファイルを使用して下のコマンドをすべてのIPアドレスに対して実行した結果を得たいです。

コマンド▲IPアドレス▲ID > result.txt

IPアドレスの配列と、IDの配列を作成し、それをforでループさせれば良いのではと考え、Webで調べましたが実現方法がわからず困っています。

素人質問で申し訳ありませんが知恵を貸してください。

Aベストアンサー

pasteコマンドでファイルを横に連結すれば、配列を使う必要は無い。

paste IP.txt ID.txt |
while read ip id
do コマンド $ip $id
done > result.txt

bashの配列に入れるのだとすると

ip=(`cat IP.txt`)
id=(`cat ID.txt`)
for i in ${!ip[*]}
do コマンド ${ip[$i]} ${id[$i]}
done > result.txt

>Webで調べましたが実現方法がわからず困っています。

man bash を見ましょう。

Qシェルスクリプト 自身のファイルパスを取得する方法

基本的なことかもしれないのですが、教えて下さい。

シェルスクリプトをLinuxで作成しています。
シェルスクリプトを実行して、実行したスクリプトまでの絶対パスを取得したいのですが、方法がわかりません。
いろいろ調べて、
dirname $0
という方法で出来るような記述も見つけたのですが、$0ではスクリプト名を取得することしか出来ず、ファイルパスを取得することが出来ませんでした。
OS : Linux カーネル : 2.6
です。
他に必要な情報があれば教えて下さい。
よろしくお願いいたします。

Aベストアンサー

可能性があるのは
$PWD/${0%/*}
ですね.... 厳密にいうと, シンボリックリンクが入るとどうにもならないんですが. mount とか find とかを駆使すればできるかなぁ?

Qシェルスクリプト間で排他をとりたい

環境 linux(redhat) 使用シェル bash
シェルスクリプトAとシェルスクリプトBを作成し、
シェルスクリプトAが動作している間は、シェルスクリプトBの動作を禁止したいと考えています。
例えば、シェルスクリプトAが起動している状態で、シェルスクリプトBが起動されたとき、シェルスクリプトBは、シェルスクリプトAが起動していることを検知して、自発的に処理を終了するようにしたいと考えています。
上記のような仕組みをシェルスクリプトで実現可能でしょうか?
基本的には、シェルスクリプトの先頭で、ある資源のロックを行い、終了時にロックの解放ができれば、その仕組みは実現可能と考えています。
(シェルの異常終了時は、ロックが自動的に解放されることが望ましい)
上記のようなことをシェル(bash)で実現可能でしょうか。
bash単独での方法、もしくはbashからperl,C言語作成の実行モジュールを呼び出す方法でもかまいません。
(ちなみにperl(もしくはC言語作成のモジュール)単独では実現可能なことはわかっています)

Aベストアンサー

lockfileコマンドでいけるのではないかと。
詳しくはman lockfileをご覧下さい。

ただ、異常終了時は少し困りますね。
trapコマンドでシグナルを捕捉することはできますが、
SIGKILLは捕捉できないです。
まぁ、どうしようもないですが。

QシェルスクリプトでFTPの実行結果を取得するには

OS redhat linux
シェル bornシェル

でftpを実行するスクリプトを作っていますが、
ftpの実行結果は取得できるのでしょうか?

ftp -n < ftpCom.txt

宜しくお願いします。

Aベストアンサー

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラーが発生しました" >> logfile
exit 1
fi

みたいなことをしていました。grep の引数 ^226 は行頭が226から始まる行を検索、という意味で、grepでマッチする行があった場合は0が戻り値となり、マッチしなければ0以外が戻り値となるので、それを利用していました。

実際の運用では、処理が異常終了したときにlogfileを見て、FTPのエラーだったらさらにftpLog.txtを見る、みたいな感じでした。

なお、FTPサーバが返すコードについては下記RFCの4.2辺りを参照してください。もっとも、サーバによってこれら全てが実装されてるとは限りませんが。

http://hp.vector.co.jp/authors/VA002682/rfc959j.htm

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラー...続きを読む

Q趣味のプログラミング、シェルスクリプトでやるなら?またはPerl?

新人SEです。仕事でUNIXのシェルスクリプトを使っているのですが休日にも趣味でシェルスクリプトで何か書けたらいいと思っています。
しかし趣味のシェルスクリプトとなると、何を書いたら楽しめるか・便利になるのかあまりイメージが湧きません・・自宅でサーバ管理などしてるわけではないので、クライアント側では何かシェルスクリプトを使うメリットがあるのか分からないのです。
ちなみに、シェルスクリプトが趣味になりそうになかったら、同じUNIX系ツールということでPerlを覚えようかとも思っています。Webアプリの作成などにも興味ありますし・・
趣味のシェルスクリプト、何かいい例などありますでしょうか?関連してPerlについてでもいいので何か教えて頂けると嬉しいです。

Aベストアンサー

UNIXならC言語だと思います。
趣味でシェルスクリプトというのもなんだか良くわかりませんね。私はパズルが好きなので、エクセルマクロでパズルを解くプログラムを作ったり、カレンダーを作ったりしましたね。
もし趣味でもUNIX環境ならば、C言語かな。Windowsであれば、エクセルVBAや無料のC#、VisualBasicをお勧めします。シェルスクリプトやperlはそんなに難しくないので、なにかひとつの言語ができるようになればあとは容易いと思いますよ。

Qシェルスクリプト 自身のファイルパスを取得する方法2

シェルスクリプトで、自身のファイルパスを取得する方法を検索したところ、下記ページへとたどり着きました。
▼おしえて!HOME'Sくん シェルスクリプト 自身のファイルパスを取得する方法
http://oshiete.homes.jp/qa2419248.html
▼教えて?Coneco shシェルで実行パスではなくファイルのパスを取得する方法
http://oshiete.coneco.net/qa2866868.html

しかし、それぞれのページに掲載されていた
${0%/*}

${1%/*}
の意味がどうしてもわかりません。(一応、bashとかで検索してみたりはしました)

そこで、下記内容について、教えてください!
・この0というのは、$0のことなのでしょうか。
・この%は、正規表現か何かなのでしょうか。
・この/は何を指しているのでしょうか?
・この*は、どの部分の1文字以上を指しているのでしょうか?

以上、よろしくお願いしますッ!

Aベストアンサー

man bashに書いてあります。

>この0というのは、$0のことなのでしょうか。

$0は${0}の簡略表現で、${0%/*}などはそれに修飾子を付けたものです。

>この%は、正規表現か何かなのでしょうか。

正規表現ではありません。man bashより抜粋:
> ${parameter%word}
> ${parameter%%word}
>word が展開され、パス名展開の場合と同じようなパターンを作ります。
>このパターンが parameter を展開した値の末尾の部分とマッチする場合、
>展開結果は parameter を展開した値から最短一致パターン (``%'' の場合)
>または最長一致パターン (``%%'' の場合) を取り除いたものになります。

>この/は何を指しているのでしょうか?
>この*は、どの部分の1文字以上を指しているのでしょうか?

「/*」は、スラッシュの後に任意の文字が0文字以上を表します。正規表現で書くと「/.*」です。
「パス名展開の場合と同じような」と書いてありますが、パス名展開の時 * は、パス区切りの / や ファイル名先頭の . にマッチしませんが、ここでは任意の文字列にマッチします。うーむ、この違いはman bashに書いてないかも。

man bashの説明と合わせると、${0} の内容の末尾から「/*」のファイルマッチが合致する最短パターンを取り除いたものになります。
${0}==/aaaa/bbbb/cccc だとすると、「/*」は、/aaaa/bbbb/cccc と /bbbb/cccc と /cccc に合致しますがその中の最短である /cccc が選択され、それが${0}から除去された物が最終的な結果です。つまり、/aaaa/bbbb

man bashに書いてあります。

>この0というのは、$0のことなのでしょうか。

$0は${0}の簡略表現で、${0%/*}などはそれに修飾子を付けたものです。

>この%は、正規表現か何かなのでしょうか。

正規表現ではありません。man bashより抜粋:
> ${parameter%word}
> ${parameter%%word}
>word が展開され、パス名展開の場合と同じようなパターンを作ります。
>このパターンが parameter を展開した値の末尾の部分とマッチする場合、
>展開結果は parameter を展開した値から最短一致パターン (``%'...続きを読む

Qシェルスクリプトのbashとperlについて

シェルスクリプトのbashとperlについて
今さら気づいたのですが、PerlもUNIXのコマンドやシェルスクリプトとして使用できるということでしょうか。
RubyやPHPをUNIXのコマンドやシェルスクリプトとして使用することはできますでしょうか。
学ぶとしたら、bashとPerlのどちらが良いでしょうか。

また、シェルスクリプトはどんな用途や利点がありますでしょうか。
Webアプリケーションによるバックアップやログをタイマーでセットして自動的に取得したりすることは可能でしょうか。

Aベストアンサー

perlやphpをシェルとしては使い物にはなりません。

コマンドシェルとして使用するには最低限一行ずつ命令を読み取り、その都度実行する仕組みが必要です。
perl等は1行ずつではなくファイルすべてを読み終わってから実行するため、シェルとしては役に立ちません。

イメージでいうと、ログインしてからひたすら文字を入力して、実際に実行されるのは、ログアウトしてからということになります。

シェルスクリプトの利点としては、普段使用しているコマンドをそのままの書式で作成できるというところです。

また、UNIX系のOSであれば何らかのシェルは必ず入っています。Perl等は別途インストールする必要があります。とくに、サーバーを構築する場合はサービスに不要なツールはインストールしたくないので、perl等の言語は入れていない場合も多いです。

Qシェルスクリプト:N日前の日付の取得

#/bin/sh

DAY=$1
TIME=`date --date '"$DAY" day ago' +%Y%m%d`
echo $TIME


上を実行しても$DAYが展開されず、
date: invalid date '"$DAY" day ago'
と、dateコマンドがエラーを返してきます。

$DAYを展開させるためにはどうクォートすればいいのでしょうか?

Aベストアンサー

#/bin/sh

DAY=$1
TIME=`date --date "$DAY"' days ago' +%Y%m%d`
echo $TIME

これではどうでしょうか?


人気Q&Aランキング

おすすめ情報