2010-02-22 17 views
7

È possibile avere più operatori unari in istruzioni if. Ecco il frammento di codice che mi sta dando errore.bash: operatori Unario multipli in istruzione if

Si prega di correggere il codice qui.

if [ -f $input_file ] -a [ -f $output_file ] -a [ -f $log_file ] ] 
then 
### Some Code here 
fi 

Grazie Kiran

risposta

10
if [ -f "file1" -a -f "file2" -a "file3" ]; then 
    #some code 
fi 
+0

Funziona come un Magic .. grazie per la risposta rapida .. – Kiran

1

[ è un comando, non fa parte della dichiarazione if. In quanto tale, dovresti passare ognuno degli argomenti appropriati invece di provare a eseguirlo in modo errato come hai fatto tu.

if [ arg1 arg2 arg3 arg4 ... ] 
then 
+0

In ambienti Cygwin, c'è un C: \ cygwin \ bin \\ [. Exe. Sensazione davvero strana per dare un'occhiata a questa cartella per la prima volta. – Boldewyn

+0

Comando simile '[' in '/ usr/bin' sulla maggior parte delle distro di linux, nonostante il quale' ['è solitamente un built-in bash. –

4

Si può vedere l'operatore [ ... ] solo come una scorciatoia per test .... Le opzioni sono usate allo stesso modo.

Quindi nel tuo caso si potrebbe o scrivere il modo ghostdog74 o:

if [ -f $input_file ] && [ -f $output_file ] && [ -f $log_file ] 
then 
### Some Code here 
fi 
5

Se si utilizza doppio staffa di Bash, si può fare questo:

if [[ -f "$input_file" && -f "$output_file" && -f "$log_file" ]] 

che trovo più pulito leggere di altre opzioni mostrate qui (ma questo è soggettivo). Tuttavia, ha other advantages.

E, come ghostdog74 mostra, si dovrebbe sempre citare le variabili contenenti nomi di file.

+0

Non è necessario citare variabili contenenti nomi di file se si utilizza la doppia parentesi poiché BASH non esegue WordSplitting con parentesi doppie. Vedi http://mywiki.wooledge.org/BashFAQ/031 – Cliff