2012-06-19 13 views
29

Come si confrontano due stringhe in Fish (come "abc" == "def" in altre lingue)?Test per confronto di stringhe di uguaglianza/stringa in Fish shell?

Finora, ho usato una combinazione di contains (scopre che contains "" $a restituisce solo 0 se $a è la stringa vuota, anche se questo non è sembrato di lavorare per me in tutti i casi) e switch (con un case "what_i_want_to_match" e un case '*'). Nessuno di questi metodi sembra particolarmente ... corretto, però.

+5

Quindi, '' ['è in realtà un comando ('/bin/['su OS X), ** e ** un builtin Bash, con diverse sintassi. Vai a capire! –

+0

questo commento ha appena reso la mia giornata! [Il comando è uno strumento davvero potente. – yagooar

+4

Personalmente, ho iniziato a usare 'test' invece di' ['in tutti i miei script, in modo che sia chiaro che si tratta di un comando esterno e non di una parte della lingua. ('test' e' ['sono esattamente lo stesso strumento.) Naturalmente, penso che' test' sia anche un builtin di Bash. –

risposta

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

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

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

o uno di linea:

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

Aha! Strano, ho pensato di provare prima le parentesi quadre; forse era il singolo '=' che mi ha gettato. –

+1

Sì, anche il singolo '=' mi lancia. –

+2

un liner più corto: '[abc = abc]; ed eco uguale " – kzh

8

A volte si vuole verificare la presenza di stringhe vuote o variabili indefinite, che sono falsy nel pesce.

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 

È anche possibile utilizzare al posto di test[.

Un esempio pratico è il controllo se si è in un ramo 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 
Problemi correlati