使用 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
我有一个包含脚本文件的目录,比如说:
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