Bashはどのような状況で単語の分離とワイルドカードを実行しませんか?

Bashはどのような状況で単語の分離とワイルドカードを実行しませんか?

この場合、Bashはワイルドカードに対してトークン化を実行しません。

  • 割り当てられたLHSまたはRHS(インデックス配列を除く)
    var=$value                                # simple variable
    declare -A hash
    key="key with a space"
    hash[$key]=$value                         # index of an associative array
    
    arr=$(echo "1 2 3")                       # word splitting does happen here
    
  • ~へ[[ ]]
    var="one two"
    if [[ $var = *" "* ]]; then ...           # check if var has a space in it
    if [[ $(echo "one two") = $var ]]; then   # use the output of command substitution to compare with var
    
  • ~へ(( ))
    ((sum = $(echo "99 + 1")))                  # assigns 100 to sum
    
  • この文字列では
    cat <<< *                                 # gives '*' as the output
    

Bashが単語の分離とワイルドカードを実行または実行しない状況の明示的なリストはありますか?

答え1

これは通常意味がないか意味がない場合であるため、リストではなくコンテキストです。ただし、リストではないコンテキストではこれを行いますが、複数のアイテムが作成されたり、アイテムをスペースで連結したりすると文句を言います。

また、ワイルドカードパターンの一致とファイル名の生成またはワイルドカード(パターンと一致するファイル名のリストの生成)を区別することも重要です。

たとえば、現在のディレクトリに隠されていないファイルのリストには展開されませんが、まだパターンとして解釈されるため、[[ foo = * ]]ワイルドカードはありません(ここではパターンマッチングに対してtrueを返します)。**foo*

ここで、分割とは引用符のない引数拡張($param)、コマンド置換($(...)および`...`)、および算術拡張(および$((...))$[...]で実行される暗黙的な分割を意味し、$IFS次の特殊引数を使用します。リストコンテキスト

*以下でこの例を挙げましょう。パターンとして、すべての文字シーケンスと一致します。 globとして、現在のディレクトリから隠されていないすべてのファイル(の影響を受けるdotglob、...)に展開されますGLOBIGNORE

以下はbash他のシェルにも適用され、変更があります。

分割とワイルドカードは発生しません。

  • 引用するときは、、、、、'*'"*"使用してください。\*$'*'$"*"

  • ここでは、ドキュメント(区切り文字を引用するかどうかにかかわらず):

    cat << EOF
    *
    EOF
    cat << 'EOF'
    *
    EOF
    
  • 算術式の内部:

    • echo $((2 * 2))*ワイルドカードではありませんが、$((...))分割+globで後で試してみてくださいIFS=4
    • array[2 * 2]=4// ${array[2 * 2]}。 (はワイルドカードです)には引用符exec {array[2*2]}>&1が必要です。unset -v 'a[1]'[1]
    • ((2 * 2))
    • echo $[2 * 2]
  • スカラー変数の割り当て:

    • var=*
    • array[x]=*
    • hash[key]=*
    • array=([1]=*)(以前のバージョンではワイルドカードを使用していましたが、たとえばbash現在のディレクトリからファイルを呼び出すときは別の操作を行いました。)1=foo
    • var+=*
  • 連想配列キーから:

    • typeset -A hash; hash[**]=value; v=${hash[**]}。非常に特別*ですが。@
  • //割り当て後export//特定の場合のみ:割り当てキーワードと変数名は部分的にも拡張の結果として引用できません。割り当てとリダイレクトは以前に発生する可能性がありますが、次の場合は発生しません。localtypesetdeclarereadonly=command

    • 確認(split+globを除く):
      • export a=*
      • x=1 < /dev/null export foo a=*
    • 異常(split+glob実行):
      • ""export a=*
      • command export a=*(POSIXモードを除く)
      • export "a"=*
      • export a\=*
      • "$(echo export)" a=*

    詳しくは以下をご覧ください。ローカル変数の割り当てには引用符が必要ですか?

  • case * in (...); esac

  • case x in (*); esac(split + globはありませんが*パターンとして扱われ、引用されていない拡張のワイルドカードにも適用されます。例var=*; case x in ($var):)

  • [[...]]。ただし、、、演算子の右側に引用符のないワイルドカード文字があると、パターンマッチングが行われ=ます。==!=

  • バージョン4.4以降、ここに文字列があります。以前のバージョンでは分割が行われ(ワイルドカードではありません)、結果の単語が空白になりました。

  • シェルがPOSIXモードで非対話型の場合、リダイレクトされたターゲットから:それ以外の場合はbash -o posix -c 'echo test > *'分割+globが実行され、bash1つより少ないまたは多くの要素のリストに展開するとエラーが報告されます。

関連情報