gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:06:50 24 4
gpt4 key购买 nike

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

  • foo
  • 条形图

我要进去

do-for * pwd

并让 bash 打印工作目录 inside foo,然后 inside bar

通过阅读网络上的无数答案,我认为我可以做到这一点:

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

显然,虽然 glob * 被扩展到其他命令行参数变量中!所以第一次通过循环,对于 $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

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

关于bash - 在 bash shell 脚本中从 glob 目录内的命令行执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41194174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com