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
構文の何が問題になっていますか?
いくつかのスペースがありません。たとえば、[!
は[ !
でなければならず、"]
は" ]
でなければなりません。修正したコードを見てください。
#!/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からのコメントに感謝します。