web-dev-qa-db-ja.com

シェルスクリプトから、引数を指定して別のスクリプトを実行し、そのリターンコードを取得します

I686/32ビットデュアルCPUで、Debian Stretchを新たにインストールし、Octave 4.2.1をインストールし、実行権限を付与した後、./mytestを実行しました。

#!/bin/bash
./mytest.m

ここで、test.m

#!/usr/bin/octave
exit(0)

~/tmpに格納されている2つのスクリプトを考えると、mytest

#!/bin/bash

if $1/mytest.m "$2"; then
  echo "good"
else
  echo "bad"
fi

およびmytest.m

#!/usr/bin/octave

param = argv(){1};

if strcmp(param, "happyend")
  exit(0)
else
  exit(1)
end

tmp/mytest tmp happyendを実行すると、通常はhappyendmytestに渡され、続いてmytest.mに渡され、信号0がmytestに戻され、 'goodが出力されます。 '。では、変数のmytest.mからリターン(終了)コードを取得するにはどうすればよいですか? (上記の例では0)。

直感的なオプション

#!/bin/bash

result=$("$1"/mytest.m "$2")

if [ $result = 0 ]; then
  echo "good"
else
  echo "bad"
fi

動作しません。

2
nightcod3r

コマンドから戻り(終了)コードを取得するには、$?値をおそらくresultという変数に保存する必要があります。

"$1/mytest.m" "$2"
result=$?
if [ "$result" -eq 0 ]; then
  echo "good"
else
  echo "bad"
fi

テストするのに十分な時間だけ結果を保存したい場合は、次のようにresult変数をスキップします。

"$1/mytest.m" "$2"
if [ $? -eq 0 ]; then
  echo "good"
else
  echo "bad"
fi

ただし、mytest.mの実行後すぐに$?をテストするように注意してください。後続のコマンドは、theirリターンコードを$?に入れます。

結果がゼロかどうかだけをテストしたい場合は、整数として扱う必要はありません。コマンド自体を条件付きとして扱うだけです。

if "$1/mytest.m" "$2"; then
  echo "good"
else
  echo "bad"
fi
5
Jeff Schaller