web-dev-qa-db-ja.com

関数の成功/失敗ステータスをBashの変数に割り当てる方法は?

私はそれを行う方法が次のとおりであることを知っています:

# run a command here, like [[ $A == *"ABC"* ]]
result=$?
if (( result == 0 ))
then
  result=true
else
  result=false
fi

それから私はすることができます:

if $result
then
...

コードの最初のブロックを書く1行の方法はありますか?私はCでこのようなことをすることができます:

bool result = funct_a() && funk_b()
cmd && result=true || result=false
4
Hauke Laging

通常、コマンドは_$?_と_(( .. ))_を回避するのではなく、ifステートメントに直接配置します。特に_[[ .. ]]_のようなものでは:条件付き構造のようにさえ見えます。

_if [[ $A == *"ABC"* ]]; then
     result=true
     dosomethinghere
     ...         
_

また、_if $result ..._を実行する場合、実際には変数resultに含まれるコマンドを実行していることに注意してください。 truefalseはコマンドとして実行しても問題ありませんが、resultrm ..のようなものが含まれている可能性がある場合は、実行したくないでしょう。

代わりに、上記のように_$?_の値を_result=$?_で保存し、必要に応じて別のレベルを追加する代わりにif (( result == 0 ))または_if [[ $result == 0 ]]_を使用できます。 resultへの割り当ての数。

1
ilkkachu

あなたはこれを行うことができます:

cmd; f result

この小さな機能の助けを借りて:

f () { last="$?"; declare -n ref="$1"; [[ "$last" == 0 ]] && ref=true || ref=false;}

(この関数は、f ...よりも適切なものと呼ぶことができます。何が適切かわかりません。)とにかく、コマンドの直後に適用し、セミコロンでコマンドから分離する必要があります。 、&&または||とチェーンされていません。 $のない結果変数の名前を取ります。関数は渡された名前の参照を作成し、残りは明白です。

これがデモンストレーションです:

$ f () { last="$?"; declare -n ref="$1"; [[ "$last" == 0 ]] && ref=true || ref=false;}
$ true; f result; echo "$result"
true
$ false; f result; echo "$result"
false

さらに洗練されたヘルパーを探すこともできます。

g () { declare -n ref="$1"; shift; "$@" && ref=true || ref=false; }

これは、コマンドの後に結果変数が続くことになっています。残りは同じです。 gの動作は次のとおりです。

$ g () { declare -n ref="$1"; shift; "$@" && ref=true || ref=false; }
$ g result ls -lt; echo "$result"
total 2488
drwxr-xr-x  6 tomas tomas    4096 Jan 22 11:41 Documents
drwxr-xr-x  2 tomas tomas    4096 Jan 22 11:26 Pictures
...
true
$ g result asdfasdf; echo "$result"
bash: asdfasdf: command not found
false

または、必要に応じてfおよびgという名前を保持することもできます。

0
user147505