bashで二重引用符と二重引用符がないことの違いは何ですか

bashで二重引用符と二重引用符がないことの違いは何ですか

bashスクリプトがあり、そのうちの1つに次のものが含まれています。

#!/bin/bash
source $(dirname ${BASH_SOURCE[0]})/script.sh

そしてその他の内容は次のとおりです。

#!/bin/bash
source "$(dirname ${BASH_SOURCE[0]})/script.sh"

これらのスクリプトはどのように異なる動作をし、その理由は何ですか?何はい違い?

ベストアンサー1

引用符のない文字列は次のように保護されています。噴射そしてワイルドカード。また、見ることができますバッシュトラップ #14

比較する

$ echo $(printf 'foo\nbar\nquux\n*')
foo bar quux ssh-13yzvBMwVYgn ssh-3JIxkphQ07Ei ssh-6YC5dbnk1wOc 

そして

$ echo "$(printf 'foo\nbar\nquux\n*')"
foo
bar
quux
*

単語分割が発生すると、最初の文字は区切り文字IFS(デフォルトでは空白)として機能します。

ほとんどすべての場合に引用符を追加する必要があります。次のようないくつかの例外があります。

  • 単純な(配列ではない)割り当てやステートメントなど、トークン化/グローバル化が発生しない式からcase。次は安全です。

    • foo=*
    • foo=${bar}qux${quux}
    • foo=$(bar "${quux}")
    • case ${var} in

    しかし、これは本当ではありません(あなたが探しているのが文字通りアスタリスク文字を持つ単一の要素である場合)。

    • foo=( * )
  • スペースで区切られた文字列でトークンを繰り返すなど、特別にトークン化を実行したい場合(ワイルドカードを無効にする)が、可能であれば配列を使用してください。

おすすめ記事