如何在bash函数参数中延迟/防止星号扩展?

时间:2019-07-18 14:54:34

标签: bash

我写了一个bash函数,可以帮助我更快地浏览项目目录。该函数的第一个参数是传递给python脚本的关键字,该脚本确定cd的基本路径。如果将其他参数传递给该函数,它将按传递顺序进入每个子目录。例如:

$ go intf -> cd to $BASE/interface  
$ go intf foo -> cd to $BASE/interface/foo

当我使用通配符-时出现问题,通配符在执行函数的目录中匹配。因此,请考虑简单的目录结构:

$BASE/foo1  
$BASE/interface/foo

如果我目前在$BASE,并且我运行:

$ go intf foo*

我的命令将我带到$BASE/interface,然后尝试进入新路径中不存在的foo1。除非模式与原始目录中的模式匹配,否则这种表示法可以很好地发挥作用。

这是我的功能(省略了错误检查)。最后,for循环是我要为上述情况“修复”的内容。我尝试使用eval "cd [...]"以及其他引号,循环等形式。

go() {
  OUTPUT=$(python ~/bin/go.py $1)
  cd "$OUTPUT"
  for i in "${@:2}"; do cd "$i"; done
}

所以基本上,我不希望在执行for-loop cd命令之前对星号进行求值,而我不希望必须用引号将每个通配符arg包裹到我的函数调用中。如何防止/延迟通配符扩展以满足我的需求?

2 个答案:

答案 0 :(得分:0)

所以我一直坚持这个问题,但是在Gordon Davisson指出我不可能解决问题的方法之后,想出了一个非常简单的解决方案。

我将功能从cd "$i"更改为cd *$i*

go() {
  OUTPUT=$(python ~/bin/go.py $1)
  cd "$OUTPUT"
  for i in "${@:2}"; do cd *$i*; done
}

这解决了我遇到的特殊情况,仍然适用于普通情况,并且由于不再需要添加星号,所以我变得更懒惰了:)

答案 1 :(得分:0)

这取决于您如何为函数设置参数。
我将以ls为例,但是它与function的工作原理相同。
如果用单引号(')封装参数,则bash不会扩展该值,但是如果不封装或使用双引号(")进行封装,则bash会扩展它的值。

请参见以下示例:

$ ls /tmp/demo/
dir1  dir2

$ ls /tmp/demo/*
/tmp/demo/dir1:

/tmp/demo/dir2:
$ ls '/tmp/demo/*'
ls: cannot access '/tmp/demo/*': No such file or directory