エコーを使用してファイル名の最後の部分を抽出する - ワイルドカードを使用して変数を割り当てる

エコーを使用してファイル名の最後の部分を抽出する - ワイルドカードを使用して変数を割り当てる

ファイル名の一部を抽出しようとしていますが、最初の_以降のすべての内容を抽出したいと思います。動作するソリューションを見つけました。下記をご覧ください。

file=22NGS71294_S191_R1_001.fastq.gz
echo $file
22NGS71294_S191_R1_001.fastq.gz
echo ${file#*[_ ]}
S191_R1_001.fastq.gz

ただし、ワイルドカードを使用すると動作が停止します。

file2=*R1*
echo $file2
22NGS71294_S191_R1_001.fastq.gz
echo ${file2#*[_ ]}
22NGS71294_S191_R1_001.fastq.gz

$ fileと$ file2のechoコマンドがまったく同じ結果を与えるので、これがうまくいかない理由はわかりません。誰かがこの動作を説明できますか?

答え1

sh, ksh, bash( またはzsh いいえこのglobassignオプションが設定されている場合)、スカラー割り当てのRHSでファイル名を生成する(別名「globbing」)は発生しません。file2=*R1*

あなたのecho $file2報酬は22NGS71294_S191_R1_001.fastq.gz次のとおりです引用しない拡張はこの時点でファイル名の生成の影響を$file2受けますecho ${file2#*[_ ]}が、実際には。echo ${'*R1*'#*[_ ]}echo *R1*いつ二重引用符が必要ですか?

ksh/bash/zshで利用可能大量に割り当て - 多くの場合、*R1*複数のファイル名が生成される可能性があるため、これを行う必要があります。たとえば、Bashでは次のようになります。

shopt -s nullglob

file2=(*R1*)
echo "${file2[@]#*_}"

関連情報