编写一种我想将通配符匹配传递给的自定义rm脚本。我在工作目录中有几个文件,这些文件与传递给脚本的通配符相匹配,但是我只能从一个简单的测试用例中得到其中一个文件:
sh remove r*
在remove
脚本中,我将其缩减为echo $1
。
这是目录内容: [〜/ project] $ ls file2 file4 newTestFile remove_engine恢复 file3 fileName_1234 remove remove_w restore_engine
这就是我得到的。 [〜/ project] $ sh remove r * 删除
我知道BASH甚至在执行脚本之前都会扩展通配符。但是为什么我没有得到目录中所有与f*
匹配的文件?
答案 0 :(得分:2)
路径名扩展(也称为通配符)将单个shell单词扩展为多个。就您而言
./remove r*
与运行完全相同
./remove remove remove_engine restore remove remove_w restore_engine
您发现,$1
将是remove
,因为这是第一个参数。其余文件是单独的位置参数,因此$2
将是remove_engine
,而$3
将是restore
。
要处理所有参数,请在循环中使用"$@"
:
for file in "$@"
do
printf 'One of the matches was: %s\n' "$file"
done
或直接在也接受多个参数的命令中:
# Delete all matches
echo rm "$@"