C-shell : foreach ls 无法检测 dash/hyphen 的文件名 (-)

C-shell : foreach ls cannot detect file name with dash/hyphen (-)

我有一个 c shell 脚本来过滤条件如下的文件:

*_[+-]*[A-D]*.txt

文件示例:

Reflow_-12_A124er.txt

我的脚本如下:

#!/bin/csh -f

cd /data
foreach file (`ls *_[+-]*[A-D]*.txt`)
echo "file: " $file
gzip $file
end 

如果我在数据文件夹中尝试命令 ls *_[+-]*[A-D]*.txt,则会有 txt 文件的输出。 但是,如果我尝试 运行 该脚本,该脚本不会检测到带有 (-) 的文件,即使它符合过滤器。 为什么?

老实说,我不明白为什么,但这行得通:

foreach file (`ls *_[+--]*[A-D]*.txt`)

还有这个:

foreach file (`ls *_[--+]*[A-D]*.txt`)

您可能会认为我不小心在 ASCII table 上包含了位于 +- 之间的 , 字符,对吗?没有。脚本没有选择我的示例文件 Reflow_,77D123ab.txt.

csh 的文档清楚地指出,将短划线放在字符 class 的开头将代表文字短划线(并且某些版本的 csh 接受末尾的短划线),但也许它是与 + 作为量词有关的错误,或者它只需要字符 class 中的 2 个以上字符才能正常工作。