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 ...
変数に含まれるコマンドが実際に実行されることに注意してくださいresult
。true
コマンドで実行できますが、次のfalse
内容が含まれる場合は、そうしたくありません。result
rm
$?
代わりに、上記のように値を保存してから、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