シェルコマンド 'var="[ap]"; echo $var' は「h」を出力します。説明はありますか? [コピー]

シェルコマンド 'var="[ap]"; echo $var' は「h」を出力します。説明はありますか? [コピー]

バッシュバージョン:

$ bash -version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.  
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

注文する:

$ var="[a-p]"; echo $var
h

この説明の理由が何であるかを知っている人がいます。

コンテキストシェルを使用して構成ファイルを解析し、部分名を取得するためのパターンを探しています。

[section-foo]
foo=bar

ファイルを読み取るときにセクション行がたとえば[ap]の場合、奇妙に動作します。

答え1

h実行中のディレクトリにファイル名があります。

echo $var

シェルは[a-p]globを使用しようとし、一致がある場合はglobを一致と置き換えます。ファイル名が次のh場合

echo h

拡張を参照することでこれを防ぐことができ、これはグローバルと見なされません。

echo "$var"

答え2

引用符を使用しないと、echo $var拡張は「分割」および「パス名拡張」(「ワイルドカード指定」または「ファイル名の生成」とも呼ばれます)に公開されます。

[これは*、(alsoと)を含む文字列が?「パス名拡張」ルールに従って拡張されることを意味します。あなたの場合、これは名前が1文字だけのファイルがあることを意味しますh

拡張子が引用されると、「パス名拡張」は実行されません。

$ echo "$var"
[a-p]

関連情報