从bash shell脚本中的glob从目录内的命令行执行命令

加勒特·威尔逊

在bash shell脚本中,do-for.sh我想使用bash在glob中命名的所有目录内执行命令。这已经被无数次的回答,但是我想在命令行上提供命令本身。换句话说,假设我有目录:

  • foo
  • bar

我要输入

do-for * pwd

并让bash在内部foo然后在内部bar打印工作目录

通过阅读网络上的众多答案,我认为我可以做到:

for dir in $1; do
  pushd ${dir}
  $2 $3 $4 $5 $6 $7 $8 $9
  popd
done

显然,尽管全局已*扩展为其他命令行参数变量!因此,第一次循环,正如$2 $3 $4 $5 $6 $7 $8 $9我所期望的那样,foo pwd但相反,我得到了foo bar

如何避免将命令行上的glob扩展为其他参数?还是有更好的方法来解决这个问题?

为了使这一点更清楚,这是我要使用批处理文件的方式。(顺便说一下,这在Windows批处理文件版本上工作正常。)

./do-for.sh repo-* git commit -a -m "Added new files."
弗雷德

我假设您对必须提供某种分隔符的用户开放,像这样

./do-for.sh repo-* -- git commit -a -m "Added new files."

您的脚本可以做类似的事情(这只是为了解释概念,我没有测试实际的代码):

CURRENT_DIR="$PWD"

declare -a FILES=()

for ARG in "$@"
do
  [[ "$ARG" != "--" ]] || break
  FILES+=("$ARG")
  shift
done 

if
  [[ "${1-}" = "--" ]]
then
  shift
else
  echo "You must terminate the file list with -- to separate it from the command"
  (return, exit, whatever you prefer to stop the script/function)
fi

此时,您将所有目标文件放在一个数组中,并且“ $ @”仅包含要执行的命令。剩下要做的就是:

for FILE in "${FILES[@]-}"
do
  cd "$FILE"
  "$@"
  cd "$CURRENT_DIR"
done

请注意,该解决方案的优势在于,如果您的用户忘记了“-”分隔符,则会收到通知(而不是由于引用而导致的失败)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

命令行bash用于输入多个目录并执行命令

bash脚本,执行命令行并继续执行下一个for循环

每次执行命令行时运行bash脚本

BASH脚本-在变量中执行命令

在bash脚本中获取命令行

在bash shell脚本中使用反引号执行命令

使用可变参数bash脚本在多个目录中执行命令

重试bash脚本中的命令行,直到成功,然后继续执行脚本

bash脚本中的读取命令不作为读取命令执行,而直接将文本输出到命令行

在kubernetes pod中执行命令(bash脚本)

如何在bash脚本中执行命令?

在 bash 脚本中检查执行命令的结果

在 bash 脚本中创建多个终端并继续执行命令?

bash脚本在ssh之后执行命令

Bash脚本从文件读取并执行命令

Bash-在当前Shell中执行命令

Bash:在脚本中执行多命令行字符串

命令行上的Shell参数扩展在bash脚本中不起作用

如果我从bash脚本(相对于命令行)执行命令,是否会有所不同(例如,性能方面)?

目录路径作为bash中的命令行参数

从bash中的变量在for循环内执行命令

如何从给定的bash脚本中的命令行读取值?

在bash脚本中传递命令行参数

Bash参数替换:命令行与脚本

Bash无法从命令行执行

从命令行执行bash函数

当可以在我的bash中执行命令时,Bash脚本找不到命令

BASH:grep在shell脚本中不起作用,但是echo显示正确的命令,并且可以在命令行中使用

Bash尝试在Heredoc中执行命令