${variable_name}あなたが考えるその意味ではありません...

${variable_name}あなたが考えるその意味ではありません...

単一または二重括弧を使用するのは混乱しています。このコードを見てください:

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ことは注目に値します。kshbash

おすすめ記事