web-dev-qa-db-ja.com

シェルスクリプト:複数の条件の場合

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

構文の何が問題になっていますか?

7
Henley Chiu

いくつかのスペースがありません。たとえば、[![ !でなければならず、"]" ]でなければなりません。修正したコードを見てください。

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

正常に機能させるには、[!の間にスペースが必要です。これは、[がShell-builtinコマンドとして実装されているためです(以前は別の実行可能な/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からのコメントに感謝します。

8
Satya Mishra