Bashで関数の成功/失敗状態を変数に割り当てる方法は?

Bashで関数の成功/失敗状態を変数に割り当てる方法は?

1つの方法は次のとおりです。

# 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()

答え1

cmd && result=true || result=false

答え2

多くの場合、およびバイパスせずifにステートメントにステートメントを直接配置できます。特にこれは:条件構造のようにも見えます。$?(( .. ))[[ .. ]]

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

また、実行すると、if $result ...変数に含まれるコマンドが実際に実行されることに注意してくださいresulttrueコマンドで実行できますが、次のfalse内容が含まれる場合は、そうしたくありません。resultrm

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

答え3

次のことができます。

cmd; f result

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

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

(この関数を次のより適切なものと呼ぶことができますf...何がより適切かわかりません。)とにかくコマンドの直後に適用し、from&&またはLinkではなくセミコロンで区切る必要があります||。この関数は渡された名前への参照を取り、$残りは明らかです。

以下はデモです:

$ 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

関連情報