使用 Bash 或 ZSH 有没有办法使用通配符为每个脚本执行相同的命令?

With Bash or ZSH is there a way to use a wildcard to execute the same command for each script?

我有一个包含脚本文件的目录,比如说:

scripts/
       foo.sh
       script1.sh
       test.sh
       ... etc

并希望执行每个脚本:

$ ./scripts/foo.sh start
$ ./scripts/script1.sh start
etc

不需要知道所有的脚本文件名。

有没有办法将start附加到它们并执行?我已经尝试过制表符完成,因为它在 ZSH 中非常好,使用 ./scripts/*[TAB] start 没有运气,但我想还有另一种方法可以做到这一点,所以它输出:

$ ./scripts/foo.sh start ./scripts/script1.sh start

或者其他一些更容易的方法?如果可能的话,我想在没有别名或函数的终端中这样做,因为这些脚本在我 SSH 到的盒子上,不应该修改 *._profile.*rc 文件。

使用一个简单的循环:

for script in scripts/*.sh; do
    "$script" start
done

只有一个警告:如果没有这样的 *.sh 文件,您将收到错误消息。一个简单的解决方法是检查 $script 是否实际上是一个文件(和可执行文件):

for script in scripts/*.sh; do
    [ -x "$script" ] && "$script" start
done

请注意,这可以写在一行中,如果这是您想要的:

for script in scripts/*.sh; do [ -x "$script" ] && "$script" start; done

Zsh 有一些 shorthand 循环 bash 没有:

for f (scripts/*.sh) "$f" start