私はそれを行う方法が次のとおりであることを知っています:
# 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
通常、コマンドは_$?
_と_(( .. ))
_を回避するのではなく、if
ステートメントに直接配置します。特に_[[ .. ]]
_のようなものでは:条件付き構造のようにさえ見えます。
_if [[ $A == *"ABC"* ]]; then
result=true
dosomethinghere
...
_
また、_if $result ...
_を実行する場合、実際には変数result
に含まれるコマンドを実行していることに注意してください。 true
とfalse
はコマンドとして実行しても問題ありませんが、result
にrm
..のようなものが含まれている可能性がある場合は、実行したくないでしょう。
代わりに、上記のように_$?
_の値を_result=$?
_で保存し、必要に応じて別のレベルを追加する代わりにif (( result == 0 ))
または_if [[ $result == 0 ]]
_を使用できます。 result
への割り当ての数。
あなたはこれを行うことができます:
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
という名前を保持することもできます。