bashスクリプトで機能しないコマンドラインのシェルパラメータ拡張

bashスクリプトで機能しないコマンドラインのシェルパラメータ拡張

以下を考慮してくださいGNUシェルパラメータ拡張bashコマンドラインから、つまりここで説明されています:

$ a='hello world    example'

$ echo ${a//+( )/_}
hello_world_example

ただし、同じパラメータ拡張はbashスクリプトでは機能しなくなりました。

# !/usr/bin/env bash
a='hello world    example'
echo "${a//+( )/_}"

結果は変更されていない文字列です。

hello world    example

" "より単純なパラメータ拡張では、コマンドの後に二重引用符が必要であることをすでに知っていますが、echo理由はわかりません。

しかし、この特定のパラメータ拡張がbashスクリプトで機能するようにするにはどうすればよいですか?なぜ?

答え1

+(...)の一部です拡張グローバルを使用して明示的に有効にする必要がありますshopt -s extglob

対話型シェルで動作している場合は、おそらくshopt -s extglobシェルの起動ファイルの1つにありますbashrc。明示的にスクリプトに追加します。パーサーの動作方法を変更する方法にはいくつかの欠点があるため、独自の行にあることをお勧めします。以下を参照してください。 shopt extglob設定の範囲制限は何ですか?そして他のオプションは?

関連情報