変数値から複数の末尾のスペースを削除しようとすると、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