2012-06-19 44 views
29

フィッシュの2つの文字列を比較するにはどうすればよいですか(他言語の"abc" == "def"など)?Fishシェルでの文字列の等価/文字列比較のテスト?

これまでのところ、私はcase "what_i_want_to_match"containsの組み合わせ(つまり、すべてのケースで私のために動作するように見えていないが$aは、空の文字列である場合contains "" $aのみ0を返すことが判明)とswitchを(使用してきましたおよびcase '*')。これらの方法のどちらも特に正しいとは思われません。

+5

したがって、 '['は実際にはコマンド( '/ OSXでは'/bin/[')であり、**は構文が異なる** bashの組み込み関数です。 Go figure! –

+0

このコメントはちょうど私の一日を作った! [コマンドは本当に強力なツールです。 – yagooar

+4

個人的には、実際には、すべてのスクリプトで '['の代わりに 'test'を使用し始めました。したがって、それは外部コマンドであり、言語の一部ではないことは明らかです。 ( 'test'と' ['は全く同じツールです)もちろん、' test'もBashの組み込み関数だと思います。 –

答えて

32
if [ "abc" != "def" ] 
     echo "not equal" 
    end 
    not equal 

    if [ "abc" = "def" ] 
     echo "equal" 
    end 

    if [ "abc" = "abc" ] 
     echo "equal" 
    end 
    equal 

または1つのライナー:

if [ "abc" = "abc" ]; echo "equal"; end 
equal 
+1

Aha!奇妙な、私は前に角括弧を試みたと思った。多分それは私を投げた単一の '='だったでしょう。 –

+1

ええ、単一の '='でも私を捨てます。 –

+2

短いライナー: '[abc = abc];とエコーは等しい " – kzh

8

時には、空の文字列魚にfalsyあるまたは未定義の変数、をチェックします。

set hello "world" 
set empty_string "" 
set undefined_var # Expands to empty string 

if [ $hello ] 
    echo "not empty" # <== 
else 
    echo "empty" 
end 

if [ $empty_string ] 
    echo "not empty" 
else 
    echo "empty" # <== 
end 

if [ $undefined_var ] 
    echo "not empty" 
else 
    echo "empty" # <== 
end 

またtestの代わり[使用することができます。

実際の例は、gitブランチにいるかどうかを確認することです。

function git_branch 
    echo (command git symbolic-ref HEAD ^/dev/null | sed -e 's|^refs/heads/||') 
end 

set --local branch_name (git_branch) 

if [ $branch_name ] 
    echo "$branch_name branch checked out" 
else 
    echo "not in a git repo" 
end