質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3919閲覧

shell script で コマンドライン引数 を C++ 実行ファイルに渡す方法

physics303

総合スコア89

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/22 07:34

編集2020/09/22 08:12

C++の実行ファイル./a.outはコマンドライン引数としてrankをとります.rankを0から10まで変えて./a.outを実行したい場合どのようにシェルスクリプトを書けばよいか,という質問です.

私は,以下のようにしました.

run.sh

1int rank=0 2for ((rank=0 ; rank<10; rank++)) 3do 4 ./a.out $rank& 5done 6wait

ただ,これでは正常にrankの値が渡されていないようです.プログラムではrankが全て0として処理されているようです.何が問題でしょうか.

なお,C++の中では,コマンドライン引数を次のように受け取っています.

main.cpp

1#include <cstdlib> 2 3int main(int argc, char* argv[]){ 4 int rank = atoi( argv[1] ); 5 hogehoge 6}

環境

CentOS, Bash

追記

問題を簡潔にするために,shellscriptの一部だけを取り出していましたが,問題のshellscriptの全容は以下です.以下のコードでrank引数がうまくいかない理由を考えているのです.

shell.sh

1int cnt=0; 2int noise_level=0; 3int dataset_number=0; 4int sample_size=100; 5int rank=5; 6for ((i=0 ; i<sample_size; i++)) 7do 8for ((j=0 ; j<i+1 ; j++)) 9do 10 cnt=$((cnt+1)); 11 if [ $cnt = 75 ]; then 12 wait 13 cnt=0; 14 fi 15 echo $((rank)); 16 ./a.out 0 0 opt $i $j $rank& 17done 18done 19wait 20

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/22 07:42

問題はシェルスクリプト側にある、ということは何かしらの方法で確認しましたか?
physics303

2020/09/22 07:47 編集

ありがとうございます. はい,コマンドラインに ./a.out 3 のように入力すると正常に処理が進むことから,shellscirptの文法を間違えているのかなと認識しています.$rankは"$rank"にしないといけない...など? また,C++プログラムの方で,atoiを使うと,不正な値は全て0になるので,rankが不正?文字列として認識されている?のかなとも思っています.
guest

回答3

0

y_waiwaiさんのコメントのところでも書きましたが。
int rank=0は変ですよね。
(それともブラウザによってアンダースコアが消えるなんてことが?)

if [ $cnt = 75 ]; then
これも変ですよね。等号ではなく「-eq」を使用しないといけません。

あとなんか「a.out」を990回バックグラウンドで実行し、
75回毎にwaitで引き取ることを意図している様に見えますが・・
(違っていたらすみません)

もっとシンプルなスクリプトからテストして、
問題なければ少しずつスクリプトを複雑にしていく方法を
取った方が良いと思います。

投稿2020/09/22 08:25

hana_yama_san

総合スコア923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

physics303

2020/09/22 08:32

ありがとうございます.int rank=0 は不要でした.$cnt = 75 はダメなのですね,-eq に修正しました. 意図としては,スレッドが88個あるマシンの上で,rank を固定して,iをsample_sizeまで動かして,jをiまで動かして ./a.out i j rank を実行したい,ということでした.
hana_yama_san

2020/09/22 08:42

他の言語のの常識が染み付いて、シェルスクリプトの書き方が 馴染めない。・・と言うのよくある話です。 そこは追々努力で補って下さい。 ※参考 https://qiita.com/piroor/items/77233173707a0baa6360 しかし私が一番理解してほしいのは、 >>もっとシンプルなスクリプトからテストして、 >>問題なければ少しずつスクリプトを複雑にしていく方法を >>取った方が良いと思います。 の、部分です。
physics303

2020/09/22 08:43

ありがとうございます. 論文の締め切りに追われて,慌てて慣れないことをして,ドツボにはまっています. >>これではとてものことに解決したとは・・・ この点についてご解説いただくことは可能ですか?
hana_yama_san

2020/09/22 08:56

それを私が書いたときには、 int cnt=0;が、ゴミとして残っていました。 また私の書いた等号の問題も未反映でした。 ※このタイミングの問題が最大の原因です。
physics303

2020/09/22 08:58

コメントありがとうございます. int cnt=0; と -eq を修正したので,解決した,といえる,ということで問題ないでしょうか?
hana_yama_san

2020/09/22 09:05

プログラムの多重実行部分はもっと慎重にテストを重ねて、 例えば[ $cnt -eq 75 ]が適切かどうかなど、 シェルスクリプト側にも今後変更が必要になることがあるかもしれません。 しかし、ご質問の 「$rank」が順次インクリメントされて「a.out」に 渡されるようになった。と言う部分では一旦解決として良いのでは無いでしょうか。
physics303

2020/09/22 09:26

ありがとうございました.
guest

0

自己解決

解決しました.intの型宣言を行う必要がありませんでした.

cnt=0; noise_level=0 dataset_number=0 sample_size=100 rank=5 for ((i=0 ; i<sample_size; i++)) do for ((j=0 ; j<i+1 ; j++)) do cnt=$((cnt+1)); if [ $cnt -eq 75 ]; then wait cnt=0; fi echo $((rank)); ./a.out 0 0 opt $i $j $rank& done done wait

投稿2020/09/22 08:18

編集2020/09/22 08:44
physics303

総合スコア89

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hana_yama_san

2020/09/22 08:26

これではとてものことに解決したとは・・・
physics303

2020/09/22 08:36

これで正しく 変数rankの値がプログラムにわたっているように思うのですが,どこが問題でしょうか.=と-eqは修正しました.
physics303

2020/09/22 08:37

shell script を初めて書いているので,問題点があれば教えてほしいです.
guest

0

まずは、

int rank=0 for ((rank=0 ; rank<10; rank++)) echo $rank& done wait

としてなにが表示されるのかを見てみたらどうでしょう
表示されるものが引数として渡ってます

投稿2020/09/22 07:49

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

physics303

2020/09/22 08:02 編集

ありがとうございます. やってみました. まず,文法エラーがありますね.doが足りてないです.その旨,修正しました.その結果, for ((rank=0 ; rank<10; rank++)) do echo $rank done は0から9までの数字が順番にプロットされますね.
y_waiwai

2020/09/22 07:53

なら0が渡ってるんでしょうね
hana_yama_san

2020/09/22 08:03

まあ多分 bash: int : command not found で止まるでしょうね。 ・・・というか、止まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問