2012-01-23 12 views
26

Chciałbym sprawdzić, czy istnieją oba pliki, ale jestem corazJak sprawdzić, czy istnieją dwa pliki?

test.sh: line 3: [: missing `]' 

Czy ktoś może zobaczyć, co się dzieje?

#!/bin/sh 

if [ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]; then 
    echo "both exist" 
else 
    echo "one or more is missing" 
fi 
+2

Jeśli używasz „test” zamiast „[”, problem jest bardziej oczywista. "jeśli test -f .ssh/id_rsa && test -f .ssh/ir_rsa.pub; wtedy" działa dobrze. –

Odpowiedz

33

spróbuj dodać dodatkowy nawias kwadratowy.

+3

Jest to w szczególności '[[' (bez spacji), a nie '[[' (ze spacjami). Z jakiegoś powodu, gdy zobaczyłem tę odpowiedź, myślałem, że przestrzenie są w porządku, ale nie są! – gusterlover6

27
[ -f .ssh/id_rsa -a -f .ssh/id_rsa.pub ] && echo both || echo not 

lub

[[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]] && echo both || echo not 

Ponadto, jeśli do rozwiązania [[ ]], prawdopodobnie będziesz chciał zmienić #!/bin/sh do #!/bin/bash zgodnie z tagiem dane pytanie.

+0

'[[]]' również obsługiwane przez 'ksh',' zsh' i prawdopodobnie inne powłoki. Ale lepiej użyj '#!/Bin/bash' niż' #!/Bin/sh'. – olibre

+0

@Headling, tak, próbowałem tylko ograniczyć moją odpowiedź do zestawu powłok wymienionych w pytaniu - jeden w tagach, drugi w linii shebang. –

+0

Tak, twoja odpowiedź jest idealna (krótka i poprawna). Po prostu brakowało komentarza wskazującego na pewną zgodność powłoki. Ale to szczegół nie muszą być w swojej odpowiedzi, tylko w niewielkim komentarzu poniżej ;-) Cheers – olibre

11

[[ jest składnią specyficzną dla gry bash. Dla zgodnych z POSIX muszli, trzeba:

[ -f file1 ] && [ -f file2 ] 
5
if [ -e .ssh/id_rsa -a -e .ssh/id_rsa.pub ]; then 
echo "both exist" 
else 
echo "one or more is missing" 
fi 

Tutaj

-e tylko sprawdzić plik ma wyjścia lub not.If wyjść, to powrót true.else, to return false.

-f również zrobić to samo, ale to sprawdzić, czy dany plik jest zwykłym plikiem lub not.based na to, że zwracają true/false.

Następnie używasz & &. Tak więc, do wykonania potrzebne są dwa [[..]] nawiasy.

zamiast tego można użyć operatora -a [takiego samego, jak & &] -o [taki sam jak || operator]. Jeśli potrzebujesz więcej informacji, przejdź przez ten link:

http://linux.die.net/man/1/bash.

Powiązane problemy