2012-09-01 17 views
84

Sto provando a confrontare le stringhe in bash. Ho già trovato una risposta su come farlo su stackoverflow. In sceneggiatura che sto cercando, io sto usando il codice presentato da Adam nella questione di cui:Confronto di stringhe in bash. [[: non trovato

#!/bin/bash 
string='My string'; 

if [[ "$string" == *My* ]] 
then 
    echo "It's there!"; 
fi 

needle='y s' 
if [[ "$string" == *"$needle"* ]]; then 
    echo "haystack '$string' contains needle '$needle'" 
fi 

Ho anche provato l'approccio da ubuntuforums che si può trovare nel 2 ° posto

if [[ $var =~ regexp ]]; then 
    #do something 
fi 

In entrambi i casi ho ricezione errore:

[[: not found 

Cosa sto facendo male?

+0

Potrei sbagliarmi, ma usare una singola parentesi quadra ha sempre funzionato per me. –

+1

Cosa stampa '/ bin/bash --version'? – themel

+0

GNU bash, versione 4.2.8 (1) – user1581900

risposta

73

[[ è un bash-builtin. Il tuo /bin/bash non sembra essere un vero colpo.

+0

se digito: digita '[[' ottengo [[è una parola chiave shell – user1581900

+5

Ottiene lo stesso risultato quando si esegue il comando '/ bin/bash -c" type [["'? –

+0

Sì. [[è una parola chiave shell – user1581900

94

Come stai gestendo la tua sceneggiatura? Se hai fatto con

$ sh myscript 

si dovrebbe provare:

$ bash myscript 

o, se lo script è eseguibile:

$ ./myscript 

sh e bash sono due different shells. Mentre nel primo caso si passa il copione come argomento all'interprete sh, nel secondo caso si decide sulla prima riga quale interprete verrà utilizzato.

+0

ho ottenuto il permesso negato in questo modo. con sudo ./myscript il suo comando non è stato trovato – user1581900

+10

do ** chmod + x myscript **, quindi eseguire nuovamente, non è necessario sudo –

+0

Sto ricevendo lo stesso errore. [[: non trovato – user1581900

57

è la prima linea nello script:

#!/bin/bash 

o

#!/bin/sh 

la shell sh produce questo messaggio di errore, non bash

+1

questo lo ha risolto per me! grazie^_^ – Kayvar

+1

Manca anche la prima riga per produrre l'errore menzionato dall'autore! – Anonymous

11

Ho avuto questo problema durante l'installazione Heroku Toolbelt

Ecco come ho risolto il problema

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 ago 15 2012 /bin/sh -> dash 

Come si può vedere,/bin/sh è un link a "trattino" (non bash), e [[ è bash sugarness sintattica. Quindi ho appena sostituito il link in/bin/bash. Stai attento usando rm come questo nel tuo sistema!

+3

Ignorare il valore predefinito 'sh' per la distro è sconsigliato IMHO. Una shell che viene eseguita con 'sh' dovrebbe funzionare con' dash'; se non lo fa, questo è un bug nella sceneggiatura. Se hai bisogno delle funzionalità di 'bash', usa' bash', non 'sh'. – tripleee

+2

questo suona terribile tbh – MrVaykadji

+0

Sono d'accordo, era solo una brutta soluzione. Una soluzione simile ma migliore sarebbe usare 'update-alternatives' (in debian-based-linux) come questo https://justinconover.wordpress.com/2012/05/14/ubuntu-changing-dash-to-bash/ ma alla fine, sarebbe lo stesso. – jperelli

3

Specificare bash anziché sh durante l'esecuzione dello script. Personalmente ho notato che sono diversi sotto Ubuntu 12.10:

bash script.sh arg0 ... argn

+0

Questo lo ha risolto per me! – Djamillah

6

Come accennato @Ansgar, [[ è una da bash, cioè integrato in Bash e non disponibile per altre shell. Se vuoi che il tuo script sia portatile, usa [. I confronti avranno anche bisogno di una sintassi diversa: cambiare == a =.