2012-01-23 5 views
26

두 파일이 존재하는 경우 내가 확인하고 싶은,하지만 난두 파일이 있는지 테스트하는 방법은 무엇입니까?

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

사람이 뭐가 잘못 볼 수는 무엇입니까?

#!/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

'['대신 'test'를 사용하면 문제가 더욱 명확 해집니다. "test -f .ssh/id_rsa && test -f .ssh/ir_rsa.pub이면"잘 작동합니다. –

답변

33

대괄호를 추가해보십시오.

if [[ -f .ssh/id_rsa && -f .ssh/id_rsa.pub ]]; then 
+3

그것은 특별히'[['(공백없이)이고'[['(공백으로))가 아닙니다. 어떤 이유에서이 대답을 보았을 때 나는 공간이 괜찮다고 생각했지만 그렇지 않았습니다! – gusterlover6

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

나 또한

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

[[ ]] 솔루션에 대한 당신, 당신은 아마 당신의 질문의 태그 준수 #!/bin/bash#!/bin/sh을 변경할 수 있습니다.

+0

'[[]]'는'ksh','zsh'와 아마 다른 쉘에서도 지원합니다. 그러나'#!/bin/shash보다'#!/bin/bash를 사용하는 것이 더 좋습니다. – olibre

+0

@oHessling, 네, 질문에 나열된 셸 세트에 대한 답변을 제한하려고했습니다. 하나는 태그에, 다른 하나는 shebang 행에 있습니다. –

+0

예, 답은 완벽합니다 (짧고 정확함). 쉘 준수를 지적하는 주석이 누락되었습니다. 그러나이 작은 부분은 답안에있을 필요는 없습니다. ;-) 건배 – olibre

11

[[은 bash 특정 구문입니다. POSIX 호환 쉘의 경우, 다음이 필요합니다 여기

[ -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 

,

-e 검사는 파일이 종료 또는 종료 not.If, 그것은 true.else 반환 false를 반환합니다.

-f도 동일한 작업을 수행하지만 주어진 파일이 일반 파일인지 여부를 확인합니다.이 파일은 true/false를 반환합니다.

그런 다음 & &을 사용하고 있습니다. 따라서 실행하려면 [[..]] 대괄호가 필요합니다.

대신 -a [& & 연산자와 동일] -o [||와 동일]를 사용할 수 있습니다. 운영자]. 자세한 정보가 필요하면

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

관련 문제