BASH-地球匹配仅返回第一个匹配

时间:2018-06-25 19:22:29

标签: bash shell unix command-line

编写一种我想将通配符匹配传递给的自定义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*匹配的文件?

1 个答案:

答案 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 "$@"