2017-04-01 2 views
1

は、どのように私のような変数にこれらを切り替えるその後、if文を書くことができます。if/elseをBashでbooleanで書く方法は?

if(switch){ 
    server_var_shortname=$server_shared_shortname 
    server_var=$server_shared 
    server_var_bare=$server_shared_bare 
} else { 
    server_var_shortname=$server_vps_shortname 
    server_var=$server_vps 
    server_var_bare=$server_vps_bare 
} 

私はbashの構文に慣れていないんだと基本的にはブールの場合/ else文を必要としています。また、true/falseの値をそのまま使用できますか?また、elseステートメントを実行するにはどうすればよいですか?

$switch=true; 
if $switch 
then 
    server_var_shortname=$server_shared_shortname 
    server_var=$server_shared 
    server_var_bare=$server_shared_bare 
fi 
+0

重複は、「ブールをカバーこの質問の側面は、基本的ではあるが、Bashや他のPOSIX風シェルの 'if'、' then'、 'elif'、' else'、 'fi'の重要な機能も含まれています。問題の表記法はよりCに似ています.Cシェルはその表記をより直接的にサポートしていますが、Cシェルを使用しないでください。特に重大なスクリプト作業では使用しないでください。海の殻は海岸に残すべきです)。 –

答えて

1

Bashにはブール値の概念がありません。真偽値はありません。構造

[ $switch ] 

switch変数が設定されていないか、空の文字列に設定されている場合を除き、trueになります。また

[ ] && echo yes      # nothing is echoed 
[ "" ] && echo yes      # nothing is echoed 
unset switch && [ $switch ] && echo yes # nothing is echoed 
switch=1 && [ $switch ] && echo yes  # yes is echoed 
switch=0 && [ $switch ] && echo yes  # yes is echoed - shell makes no distinction of contents - it is true as long it is not empty 

を参照してください:(bashを含む)

+1

素晴らしいテスト! –

4

まず、シェルブール値を持っていません。彼らは整数を持っていません(しかし、彼らは偽のそれを並べ替えることができます)。ほとんどの場合、文字列があります。 bashには、文字列の配列もあります。ブール値を偽装するにはいくつかの方法があります。私のお気に入りは文字列 "true"と "false"を使うことです。これらのコマンドは、常に成功して失敗するコマンドの名前にもなります。なぜなら、ifステートメントは実際にコマンドを受け取り、成功した場合はthen句を実行し、失敗した場合はelse句を実行するからです。したがって、ブール値を "実行"することができ、 "true"に設定すると成功し、 "false"に設定すると失敗します。あなたがifのために表示されますより多くの一般的なフォーマットはif [ something ]; thenのように、角括弧を持っていることを

switch=true # This doesn't have quotes around it, but it's a string anyway. 
# ... 
if $switch; then 
    server_var_shortname=$server_shared_shortname 
    server_var=$server_shared 
    server_var_bare=$server_shared_bare 
else 
    server_var_shortname=$server_vps_shortname 
    server_var=$server_vps 
    server_var_bare=$server_vps_bare 
fi 

注:このように。この場合、[は実際にはその引数を式として評価するコマンド(ではなく、という面白い並べ替え演算子)です。したがって、[ "some string" = "some other string" ]は、文字列が等しくないために失敗するコマンドです。 if [ "$switch" = true ]; thenを使用することができますが、不正なブール値を直接使用して使用することをお勧めします。

警告:私が示唆しているチートを使用する場合は、 "真偽"変数が "true"または "false"に設定されていることを確認してください。それが何かに設定されている場合、私はその結果について一切責任を負いません。

他のいくつかの構文ノート:変数の

  • 使用$それらの値を取得、ない彼らに割り当てます。 $switch=true;があります。エラーが発生します。
  • また、その行の最後にセミコロンがあります。これは不要です。セミコロンは、同じ行(および他のいくつかの場所)で複数のコマンドを区切るために使用されますが、行の最後(/ only)コマンドを終了する必要はありません。
  • [コマンド(これはtestとも呼ばれます)はちょっと変わった構文です。主にコマンドなので、通常のコマンド解析が行われます。[ 5 > 19 ]は、[ 5 ]と解析され、出力は "19"という名前のファイルに送信されます( "5"は空白でないためtrueです)。 >は文字列(アルファベット)の比較を行い、 "5"は "19"の後のアルファベット順であるため、[ 5 ">" 19 ]はより優れていますが、依然として真と評価されます。 [ 5 -gt 19 ]は予想通りです。

    [[ ]](同様の、しかしより洗練された構文で、すべてのシェルで利用できるわけではありません)と(())(数学では文字列ではなく、すべてのシェルではありません)。 BashFAQ #31を参照してください。

  • コマンドを変数に入れることは、一般的には悪い考えです。 BashFAQ #50を参照してください。
  • shellcheck.netはあなたの友人です。
1

Here is a good guide for If else.しかし、別のアプローチ(3ページのリンクにもあります)を示したいと思います。

あなたのコーディングはJavascriptのように見えるので、私はSwitchと考えるとifの代わりにcaseコマンドを意味することもできます。 JavaScriptのSwitchはシェル内のcaseに似ていますが、ブール値をチェックする方法はありません。文字列値はtruefalseのようにチェックすることができ、番号を確認することができます。

例...

#!/bin/bash 
case "$Variable" in 
false|0|"") 
    echo "Boolean is set to false." 
;; 
*) 
    echo "Boolean is set to true." 
;; 
esac 

追加

異なる形でboolean valuesを使用して、多くのとプログラムやツールがありますが、覚えておいてください。

2つの例...
SQLでは、一般にブール値として数値が使用されます。
Javascriptでは、true値とfalse値が使用されます。

意味:あなたのbashスクリプトは、処理する前にブール値の形式を知っている必要があります。あなたが必要なもの

0

はこのようなものです:バッシュ(およびその他のシェル)では

if 
    CONDITION_SEE_BELOW 
then 
    server_var_shortname=$server_shared_shortname 
    server_var=$server_shared 
    server_var_bare=$server_shared_bare 
else 
    server_var_shortname=$server_vps_shortname 
    server_var=$server_vps 
    server_var_bare=$server_vps_bare 
fi 

CONDITION_SEE_BELOW部分がコマンドである必要があります。コマンドは数値を返しますが、通常は0は「真」を意味し、ゼロ以外の値は「偽」を意味します。 then句は、コマンドが0または他のすべてのケースでelse句を返した場合に実行されます。戻り値は、コマンドによって出力されるテキストではありません。シェルでは、コマンドを実行した直後に特殊変数expand $?を使用してアクセスすることができます。

あなたは一つのことを行うコマンドtruefalse、とのことをテストすることができます。ゼロ(true)と非ゼロ(false)戻り値を生成します。コマンドラインでこれを試してみてください。

true ; echo "true returns $?" 
false ; echo "false returns $?" 

あなたが条件にしたい任意のコマンドを使用することができます。条件を定義するというアイデアで作成されたコマンドは、古典的なテストコマンド[ ](実際のコマンドは、冒頭の括弧のみであり、testコマンドでも利用可能です)と二重括弧で囲まれたBash-特定の[[ ]](これは技術的にはコマンドではなく、特別なシェル構文です)。

例えば、あなたのswitch変数に何もない(ヌル文字列)か何か(少なくとも1文字の文字列)が含まれているとします。あなたの場合、ヌル文字列を "false"とし、本当だ"。あなただけのスペースとタブを含む文字列が空であると見なされるべきでOKであれば

[ "$switch" ] 

は(コマンドの引数の標準のシェル拡張と単語分割の結果として発生します。その後、条件として使用することができます)、二重引用符を削除することができます。

double-bracketテストコマンドはほとんど同じですが、二重引用符はほとんどの場合必要ありません。式の中に&&||というブール論理をサポートしています。特徴として。それは、しかし、bashismです。

あなたは、両方のテストコマンドを実行することができるさまざまなテストを基準としてこれを使用することができます。

https://www.gnu.org/software/bash/manual/bashref.html#Bash-Conditional-Expressions

全くシェルプログラミングに興味があれば、各種試験を知るようにしてくださいますあなたは頻繁にそれらの多くを使用する可能性が高いので、使用することができます。

0

@ Gordonの優れた答えに加えて、bashにはDouble-Parentheses Constructも使用できます。整数で動作し、他の言語に最も近い形式です。デモ:

for i in {-2..2}; do 
    printf "for %s " "$i" 

    if ((i)) # you can omit the `$` 
    then 
     echo is nonzero 
    else 
     echo is zero 
    fi 

done 

が出力:

for -2 is nonzero 
for -1 is nonzero 
for 0 is zero 
for 1 is nonzero 
for 2 is nonzero 

あなたは例えば、内部の任意の算術演算を使用することができます。私が選んだ

for i in {1..6}; do 
    printf "for %s " "$i" 

    if ((i % 2)) #modulo 
    then 
     echo odd 
    else 
     echo even 
    fi 
done 

出力

for 1 odd 
for 2 even 
for 3 odd 
for 4 even 
for 5 odd 
for 6 even 
関連する問題