ブール値宣言の略語

ブール値宣言の略語

次のようにブール値を宣言する方法を探しています。

HOME_IS_BASE_DIR=$("home" == "${BASE_DIRECTORY}")    // boolean
USERS_IS_BASE_DIR=$("Users" == "${BASE_DIRECTORY}")   // boolean

もちろん、上記の方法はうまくいかず、エラーが発生します。

bashはホームコマンドを見つけることができません

bashはユーザーコマンドを見つけることができません

これを行うための長い方法は次のとおりです。

HOME_IS_BASE_DIR=false;
USERS_IS_BASE_DIR=false;

if [ "home" == "${BASE_DIRECTORY}" ]; then
  HOME_IS_BASE_DIR=true;
else if [  "Users" == "${BASE_DIRECTORY}" ]; then
  USERS_IS_BASE_DIR=true;
fi

これには略語がありますか?

答え1

より簡潔な表現は、次のように達成できます。

#!/bin/sh         
BASE_DIRECTORY="home";
[ "home" = "$BASE_DIRECTORY" ] && HOME_IS_BASE_DIR=true || HOME_IS_BASE_DIR=false;
echo $HOME_IS_BASE_DIR;

答え2

case ${BASE_DIRECTORY} in
    "home")
        HOME_IS_BASE_DIR=true
        USERS_IS_BASE_DIR=false
        ;;
    "Users")
        HOME_IS_BASE_DIR=false
        USERS_IS_BASE_DIR=true
        ;;
    *)
        # Handle heretofore unhandled values here
        ;;
esac

正確に短縮されたわけではありませんが、現在実行中の作業については非常に明確で、他の場所に簡単に拡張できます。しかし、これらの追加変数を使用する代わりに$ {BASE_DIRECTORY}を見てみてはいかがでしょうか?

答え3

次のようなことをリクエストしました。

HOME_IS_BASE_DIR=$("home" == "${BASE_DIRECTORY}")
USERS_IS_BASE_DIR=$("Users" == "${BASE_DIRECTORY}")

テストを関数に切り替えることができます。

HOME_IS_BASE_DIR()  { [[ "home"  == "${BASE_DIRECTORY}" ]]; }
USERS_IS_BASE_DIR() { [[ "Users" == "${BASE_DIRECTORY}" ]]; }

その後、次のテストを実行できます。


BASE_DIRECTORY="/"

if HOME_IS_BASE_DIR        ; then echo "home is base dir"    ; fi
if ! HOME_IS_BASE_DIR      ; then echo "home is NOT base dir"; fi

if ! HOME_IS_BASE_DIR && \
   ! USERS_IS_BASE_DIR     ; then echo "neither is base dir" ; fi

# output of above:
# home is NOT base dir
# neither is base dir

# ...or use &&/|| instead of 'if':
BASE_DIRECTORY="Users"
USERS_IS_BASE_DIR && echo "Users is base dir"
HOME_IS_BASE_DIR  || echo "home is NOT base dir"

# output of above:
# Users is base dir
# home is NOT base dir

上記のコードはbashとzshで動作し、dash / POSIXに簡単に適用できます。

説明する

シェルスクリプトでは、終了コード()などのブール式を作成するのが一般的ですcmd1 && cmdd。これら2つの関数はのテストに対応する終了コードを生成するため、[[ .. ]]関数のブール式を設定できます。

関数はテストが完了するたびに評価されるため、関数がBASE_DIRECTORY変更されると、を使用したテスト結果もHOME_IS_BASE_DIR変更されますUSERS_IS_BASE_DIR

関連情報