次のようにブール値を宣言する方法を探しています。
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
。