쉘 스크립트: 조건이 여러 개인 경우

쉘 스크립트: 조건이 여러 개인 경우

3개의 디렉토리가 존재하지 않는 경우 무언가를 에코하는 쉘 스크립트를 만들고 싶습니다.

이것은 제가 작성한 코드입니다: test.sh:

if [ ! -d "/home/unix/POSTagger2" ] || [! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09"] || [! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09"]; then
echo "Nope"
fi

실행하면 다음 오류가 발생합니다.

./test.sh: line 1: [!: command not found

내 문법에 문제가 있는 걸까요?

답변1

[!다음과 같은 일부 공백 이 누락되었으며 수정된 코드를 확인 [ !해야 합니다 ."]" ]

#!/bin/bash
if 
[ ! -d "/home/unix/POSTagger2" ] || 
[ ! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" ] || 
[ ! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09" ] 
then
      echo "Nope"
fi

코드의 다른 방법:

#!/bin/bash
for dir in "/home/unix/POSTagger2" "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09"; do
     if [ ! -d "$dir" ]; then echo nope ; break; fi 
done  

답변2

[!이것이 제대로 작동하려면 와 사이에 공간이 있어야 합니다 . 이는 [쉘 내장 명령으로 구현되기 때문입니다(예전에는 별도의 실행 파일이기도 했습니다 /usr/bin/[).

다음을 사용할 수도 있습니다.

if [ ! -d "/home/unix/POSTagger2" -o ! -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" -o ! -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09") ] ; then
    echo "Nope"
fi

Bash는 [[en 표현식으로 구현된 대안을 제공합니다. 연산자로 , 대신 등을 [[사용합니다 .&&||-a-o

if [[ ! (-d "/home/unix/POSTagger2" && -d "/home/unix/POSTagger2/stanford-parser-full-2015-12-09" && -d "/home/unix/POSTagger2/stanford-corenlp-full-2015-12-09") ]] ; then
    echo yes
fi

편집: 내 이해에 중요한 수정을 제공한 의견에 대해 @LucianoAndressMartini 및 @pabouk에게 감사드립니다.

관련 정보