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에게 감사드립니다.