GNU/Linux >> Linux の 問題 >  >> Linux

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

一方、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回の出現に一致します。


Linux
  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Bash =〜正規表現とHttps://regex101.com/?

  3. Bash Echoコマンドライン自体で実行されるコマンドライン(スクリプトではない)?

  1. ブレース拡張はいつ使用しますか?

  2. エイリアス コマンドを bash スクリプトまたは .bashrc ファイルで機能させる方法

  3. ターミナルウィンドウからLinuxでファイルを作成するには?

  1. シェルスクリプトを使用して /etc/hosts ファイルに行を追加します

  2. bashスクリプトは、ファイルの最初の行にテキストを追加します.

  3. jenkins パイプラインで bash コマンドを実行する