練習中です。パラメータの置換バッシュから。
私は次のようなダミースクリプトを書いた。
#!/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
ingスクリプトの内容、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)'
。?
パラメータ代替コンテキストで予約されている文字であるため、問題が発生する可能性があります。しかし、それが問題であれば、どちらの場合もモードが失敗するか成功すると予想します。
明らかなトラップはどこにありますか?
答え1
問題は、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
したがって、スクリプト内のshebang行の後に置くことができます。
~からバッシュリファレンスマニュアル:
extglob
組み込みコマンドを使用してシェルオプションを有効にすると、複数の拡張パターン一致演算子がshopt
認識されます。
?(PATTERN-LIST)
指定されたパターンが0個または1個一致します。