如何捕获“*”作为 bash 函数的参数并在比较中使用

How to capture "*" as argument to bash function and use in a comparison

我想要 bash 运行 rm -i * 如果我输入 rm * 否则 运行 常规 rm。重要的是,我不想每次使用 rm part* 等通配符时都 运行 rm -i。这是我所能想到的:

rm ()
{
    if [ "" == "*" ]; then
        rm -i *
    else
        rm 
    fi
}

但我知道这会失败。我知道我想要的比较是^*$,但我不知道如何实现它。

如果没有 shell.

的合作,根本不可能 知道您的命令是否使用通配符调用

当您调用 rm *(与任何其他命令一样)时,* 在调用 之前被替换为文件名列表 。因此,当在命令内部时,为它提供通配符的信息不再存在:</code>、<code> 等已被通配符扩展到的名称列表替换。


也就是说,既然我们是shell函数,其实我们shell的配合是可以的:

rm() {
  local cmd
  read -r _ cmd < <(HISTTIMEFORMAT=''; history 1)
  if [[ $cmd = "rm *" ]]; then
    command rm -i "$@"
  else
    command rm "$@"
  fi
}

这是如何工作的?

  • history 1 returns shell 历史记录中的最新命令(前面有数字)。
  • read -r _ cmd 将该数字读入变量 _,并将命令行的其余部分读入变量 cmd
  • [[ $cmd = "rm *" ]] 将命令与该精确字符串进行比较
  • command rm ... 运行 external rm 命令,避免再次递归回到我们的函数。

既然不能知道有没有通配符,为什么不查一下参数个数呢?

例如:

#!/bin/bash
rm () {
    if [ "$#" -gt 1 ]; then
       echo command rm -i "$@"
    else
       echo command rm "$@"
    fi
}
rm a b c
rm a