私はbashでパラメーター置換を練習しています。
次のダミースクリプトを作成しました:
#!/bin/bash
var1="/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext"
var2="/some/path/to/file/the_file.arbitrary.n.ext.0.ext"
pattern='.[0-9]?(.random).ext'
echo "${pattern}"
echo "${var1/${pattern}/}"
echo "${var2/${pattern}/}"
基本的に、このパターンはファイル名の最後の部分を取り除くことを目的としています。
名前
ダミースクリプトを実行すると、次のようになります。
~$ ./dummy.sh
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
/some/path/to/file/the_file.arbitrary.n.ext.0.ext
一方、eval
スクリプトの内容、または同等に、インタラクティブシェルでその一連のコマンドを直接入力すると、次のようになります。
~$ eval "$(cat dummy.sh)"
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext
/some/path/to/file/the_file.arbitrary.n.ext
パターン'.[0-9]*.ext'
動作するため、問題は明らかにサブ文字列'?(.random)'
に限定されます。 。問題は?
にある可能性があります 、パラメータ置換のコンテキストでは予約文字であるため。ただし、それが問題である場合は、どちらの場合もパターンが失敗するか、同じように成功することを期待します。
おそらく明らかな落とし穴はどこにありますか?
承認された回答:
問題は、extglob
シェルオプションはインタラクティブシェルで設定されていますが、スクリプトシェルでは設定されていません。
$ shopt -u extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
$ shopt -s extglob
$ echo "${var1/${pattern}/}"
/some/path/to/file/the_file.arbitrary.n.ext
したがって、shopt -s extglob
を入れてみることができます スクリプトのシバン行の直後。
Bashリファレンスマニュアルから:
extglob
の場合 シェルオプションは、shopt
を使用して有効にします 組み込み、
いくつかの拡張パターンマッチング演算子が認識されます…。
複合パターンは、次のサブパターンの1つ以上を使用して形成できます。
?(PATTERN-LIST)
指定されたパターンの0回または1回の出現に一致します。