Perché ottengo [[: non trovato durante l'esecuzione di uno script?


15

Sto cercando di scrivere uno script che deve verificare se esiste un file. Nella console scrivo

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

e ho capito

not mod

ma quando scrivo una sceneggiatura per fare la stessa cosa:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

e quindi eseguo lo script, ottengo questo:

./ex.sh: 2: [[: not found
mod

Ho salvato lo script nella directory corrente e l'ho chiamato ex.sh, quindi mi sono assicurato che fosse eseguibile. Per chiamare lo script faccio questo:

./ex.sh

Perché sto riscontrando questo problema? Ho già provato molte cose:

if [ -a /home ...

e

if test -a /home ...

Tornano entrambi

13: -a: unexpected operator

Sono stato in grado di farlo funzionare, ma per questo ho dovuto rimuovere la prima riga (#! / Bin / sh) Sai perché questo accade?
Buzu,

provare#!/bin/bash
kev

ciao kev, l'ho riconosciuto anch'io. Ho appena aggiornato la mia domanda. Ho trascorso troppo tempo su questo, ma sono contento di poterlo risolvere. Grazie per la tua risposta. È davvero la soluzione al problema.
Buzu,

@Kev Per favore, inseriscilo come risposta
slhck

Buzu, @Kev - se trovi una risposta, pubblicala come risposta di seguito , non modificare la domanda.
user1686

Risposte:


9

Stai eseguendo uno script scritto per bash sotto sh , che manca di molte funzionalità di sintassi estesa - [[è un bashcomando incorporato e non è disponibile in sh.

Cambia #!/bin/shin #!/bin/basho in #!/usr/bin/env bash.


Su alcuni sistemi, /bin/shè un collegamento simbolico a /bin/bash. Ed è probabilmente ragionevolmente sicuro supporre che lo bashsia /bin/bash.
Keith Thompson,

@Keith: è /bin/bashsulla maggior parte dei sistemi Linux, ma /usr/pkg/bin/bashsu BSD o /usr/local/bin/bashse si compila direttamente dal sorgente.
user1686

@grawity: O in qualunque altro posto decidi di metterlo se lo compili dal sorgente. Ok, buon punto. Personalmente, preferirei modificare lo shebang per ogni sistema piuttosto che usare l' /usr/bin/envhack (che utilizza quello che bashsembra essere nei chiamanti $PATHal momento), ma YMMV. (E puoi creare /bin/bashun collegamento simbolico - se hai i diritti di amministratore e non ti dispiace scherzare /bin.)
Keith Thompson

@Keith: /usr/localè dove gli autotools decidono di metterlo per impostazione predefinita. Per quanto riguarda "personalmente", mi piace avere diversi server e macchine virtuali diversi dallo stesso repository di script / strumenti, e non ho bisogno di modificare nuovamente le shebang a metà dopo ogni commit.
user1686

nessuno di loro ha lavorato per me: / im su CentOS
astroanu

0

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

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.