シェルスクリプトでブール値を表すベストプラクティスは何ですか?

シェルスクリプトでブール値を表すベストプラクティスは何ですか?

にブール値があることはわかっていますが、bashどこにも使用されていることはわかりません。

たとえば、この特定のUSBドライブが接続/マウントされているかどうかなど、自分のコンピュータから頻繁に検索される情報のラッパーを作成したいと思います。

これを達成するためのベストプラクティスは何ですか?

  • ロープ?

    drive_xyz_available=true
    
  • 数字(0は真、≠0は偽)ですか?

    drive_xyz_available=0    # evaluates to true
    
  • 機能?

    drive_xyz_available() { 
        if available_magic; then 
                return 0 
        else 
                return 1 
        fi
    }
    

私は主にラッパーを使用したい他の人が何を期待できるか知りたいです。ブール、変数に似たコマンド、または関数が呼び出されることを期待していますか?

セキュリティの観点からは、2番目のオプションが最も安全だと思いますが、あなたの経験を聞きたいです。

ベストアンサー1

bool(){ return "$((!${#1}))"; }

if bool "$var"
then : do true
else : do false

単に変数をnull以外のものに設定すると、上記の操作は[ -n "$var" ]短くなりますが(明確ではない場合)実行されます。

通常、スクリプトが環境変数を true または false として解釈すると、すべての値が true として解釈されます。(指定された値は特定のオプションを設定するために使用されることもあります)それ以外の場合、null 値は false として扱われます。

上記の!not関数は、引数にゼロ以外の文字が含まれている場合は最初の引数len - 0のブール値を返し、そうでない場合は文字がまったくない場合は1を返します。[ -n "$var" ]デフォルトでは、これを使用して実行できるのと同じテストですが、という小さな関数で終わりますbool()

普通こんな感じだバナー変数が機能します。たとえば、

[ -d "$dir" ] || dir=

$dirスクリプトの残りの部分では、使いやすさを測定するために値を見つけることができます。これはパラメータ置換にも便利です。パラメータはデフォルト値に拡張され、空または設定されていないパラメータを埋めることができますが、そうでない場合は事前設定された値に拡張できます。たとえば...

for set in yes ''
do echo "${set:-unset or null}"
done

...これが印刷されます...

yes
unset or null

もちろん、逆の場合も可能です:+が、これは事前設定されたデフォルト値のみを提供したり、まったく提供しませんが、上記の形式は値またはデフォルト値を提供できます。

したがって、これら3つのオプションに関して、実装方法に応じてどちらを操作することもできます。関数の戻り値は自己テストですが、何らかの理由で戻り値を保存する必要がある場合は、変数に入れる必要があります。ユースケースによって異なります。テストを一度評価してブール型で完了したいですか?その場合はその機能を実行し、そうでない場合は他の2つのいずれかが必要になることがあります。

おすすめ記事