単一または二重括弧を使用するのは混乱しています。このコードを見てください:
dir="/home/mazimi/VirtualBox VMs"
if [[ -d ${dir} ]]; then
echo "yep"
fi
文字列にスペースが含まれていても正常に動作します。しかし、単一の角かっこに変更すると、次のようになります。
dir="/home/mazimi/VirtualBox VMs"
if [ -d ${dir} ]; then
echo "yep"
fi
それは言う:
./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected
私がそれを次のように変更したとき:
dir="/home/mazimi/VirtualBox VMs"
if [ -d "${dir}" ]; then
echo "yep"
fi
良い結果。何が起こっているのかを説明できる人はいますか?たとえば、"${var}"
空白による問題を回避するには、いつ変数の周りに二重引用符を指定する必要がありますか?
ベストアンサー1
単一の括弧は[
実際にはコマンドのエイリアスですtest
。いいえ通事論。
単一の括弧の欠点の1つは、評価したいオペランドの1つ以上が空の文字列を返す場合、2つのオペランド(バイナリ)が必要であると文句を言うことです。これが、オペランドが空の文字列として評価されないようにするために、人々がこれを行うのを[ x$foo = x$blah ]
見る理由です。x
[[ ]]
一方、二重括弧は文法だそして[ ]
。見つかったように、「オペランドが欠落している」という問題は発生せず、Cに似た演算子の構文もさらに受け入れます>, <, >=, <=, !=, ==, &&, ||
。
私のアドバイスはこうです:あなたの通訳#!/bin/bash
者いつも使用[[ ]]
[[ ]]
すべてのPOSIXシェルがそれをサポートしているわけではありませんが、多くのシェルがそれをサポートしているzsh
ことは注目に値します。ksh
bash