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.