Confronto delle stringhe in bash. [[: non trovato


166

Sto cercando di confrontare le stringhe in bash. Ho già trovato una risposta su come farlo StackOverflow . Nello script che sto provando, sto usando il codice inviato da Adam nella domanda menzionata:

#!/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 di ubuntuforums che puoi trovare nel secondo post

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

In entrambi i casi ricevo un errore:

[[: not found

Che cosa sto facendo di sbagliato?


Potrei sbagliarmi, ma usare una sola parentesi quadra ha sempre funzionato per me.
Markus Unterwaditzer,

1
Cosa /bin/bash --versionstampa?
themel

4
[non funzionerà in questo caso, perché non supporta i modelli.
Ansgar Wiechers,

Risposte:


158

[[è un built-in bash. Il tuo /bin/bashnon sembra essere un vero bash.

Da un commento:

Aggiungi #!/bin/bashall'inizio del file


se
scrivo

5
Ottieni lo stesso risultato quando corri /bin/bash -c "type [["?
Ansgar Wiechers,

43
Questo è successo a me perché ho dimenticato di aggiungere #!/bin/bashin cima al mio file
morfico

12
Mi è successo perché ho gestito la sceneggiatura sh, tanto per la frustrazione. Ora devo solo rifare tutto ciò che ho annullato prima di trovare questa risposta.
Louis Loudog Trottier,

174

Come stai eseguendo la tua sceneggiatura? Se l'hai fatto con

$ sh myscript

dovresti provare:

$ bash myscript

oppure, se lo script è eseguibile:

$ ./myscript

sh e bash sono due differenti shell . Mentre nel primo caso stai passando il tuo script come argomento all'interprete sh, nel secondo caso decidi sulla prima riga quale interprete verrà usato.


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

11
fai chmod + x myscript , poi corri di nuovo, non hai bisogno di sudo
Akos K

2
Come stai invocando la tua sceneggiatura?
Akos K,

come hai detto. normalmente lo chiamo con '$ sh myscipt.sh'. La seconda volta dopo aver fatto chmod + x myscript.sh l'ho chiamato con ./myscript.sh
user1581900

5
L'errore è previsto quando si esegue lo script tramite sh myscript.sh, poiché /bin/shemula una shell Bourne in cui [[non è incorporato. Tuttavia, l'esecuzione dello script tramite ./script.shnon dovrebbe generare un errore, poiché in tal caso lo shebang dovrebbe /bin/bashessere utilizzato.
Ansgar Wiechers,

81

È la prima riga del tuo script:

#!/bin/bash

o

#!/bin/sh

la shell sh produce questi messaggi di errore, non bash


1
Mi mancava anche la prima riga per la produzione dell'errore menzionato dall'autore!
Anonimo

14

Ho avuto questo problema durante l'installazione di Heroku Toolbelt

Ecco come ho risolto il problema

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

Come puoi vedere, / bin / sh è un link a "trattino" (non bash), ed [[è basosità sintattica bash. Quindi ho appena sostituito il link a / bin / bash. Attento a usare rm in questo modo nel tuo sistema!

$ sudo rm /bin/sh
$ sudo ln -s /bin/bash /bin/sh

6
Sostituire l'impostazione predefinita shper la distribuzione è IMHO sconsiderato. Una shell con cui viene eseguito shdovrebbe funzionare dash; in caso contrario, questo è un bug nello script. Se hai bisogno di bashfunzionalità, usa bash, no sh.
Tripleee

4
sembra terribile tbh
MrVaykadji

2
Sono d'accordo, è stata solo una brutta soluzione. Una soluzione simile ma migliore sarebbe quella di usare update-alternatives(in debian-based-linux) come questo justinconover.wordpress.com/2012/05/14/… ma alla fine, sarebbe lo stesso.
jperelli,

13

Come accennato da @Ansgar, [[è un bashismo, cioè incorporato 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: passare ==a =.


Controllato un po 'con Ubuntu 16.04 e (sh ->) trattino 0.5.8-2.1ubuntu2 e ho scoperto che [funziona bene in combinazione con "-eq" e simili. Analoghe informazioni sugli operatori di confronto per questo contesto può essere trovato qui: stackoverflow.com/questions/10849297/... - Ho inoltre cheked con () () Operatore valutazione come raccomandato nel link seguente, ma che sembrava non riuscire per le mie modifiche invasive minime / o / avrebbe bisogno di un livello molto più profondo di modifiche al codice. softpanorama.org/Scripting/Shellorama/Control_structures/…
Alexander Stohr

3

Specificare bash invece di sh quando si esegue lo script. Personalmente ho notato che sono diversi in Ubuntu 12.10:

bash script.sh arg0 ... argn


Questo mi ha risolto!
Djamillah,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.