Bash パラメータの置換: コマンドラインとスクリプト

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

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個一致します。

関連情報