Bashから:変数置換の後の空白キャプチャ

Bashから:変数置換の後の空白キャプチャ

変数値から複数の末尾のスペースを削除しようとすると、BASH 4.3.48(SLES12 SP4)とBASH 4.4.23(OpenSUSE Leap 15.1)で次の現象が発生します。

~> xxx="-O -Wall  "
~> echo "X${xxx%% }X"    # (1)
X-O -Wall X
~> echo "X${xxx%% *}X"
X-OX
~> echo "X${xxx% }X"
X-O -Wall X
~> echo "X${xxx% *}X"    # (2)
X-O -Wall X
~> echo "X${xxx%% \*}X"
X-O -Wall  X

私は仕事を終わらせるべき(1)だと思います。(2)

このマニュアルには次のように記載されています${parameter%%word}

一致するサフィックスパターンを削除します。パス名拡張と同様に、単語を拡張してパターンを生成します。パターンがパラメータ拡張値の末尾の部分と一致する場合、拡張結果は、最短一致パターン(「%」ケース)または最長一致パターン(「%」)を持つパラメータ拡張値です。 %「ケース」が削除されました。

ドキュメントにあるように(または私が理解したように)動作しないため、これはBASHのバグであると疑われます(-Wall""の場合、一致しないサフィックス("")は削除されます)。%% *私は正しいですか?

ベストアンサー1

echo "X${xxx%% }X"パターンは単一の空白です。最も長い一致部分は空白です。最も短い一致部分は空白です。

さらに多くの場合、ワイルドカード演算子が必要です*。しかし、これは何でも一致します-Wall。 Bash globbingは直接同等の正規表現をサポートしませんa*。あなたはする必要があります拡張ワイルドカード:

$ shopt -s extglob
$ echo "X${xxx%%+( )}X"
X-O -WallX

おすすめ記事