加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:28:26 所属栏目:安全 来源:网络整理
导读:在bash shell脚本do-for.sh中,我想使用bash在glob中命名的所有目录中执行命令.这已经得到了很多次的回答,但我想在命令行上提供命令.换句话说假设我有目录: foo 吧 我想进入 do-for * pwd 并在boo中打印工作目录然后在栏内打印. 从阅读网上的无数答案,我想我
在bash shell脚本do-for.sh中,我想使用bash在glob中命名的所有目录中执行命令.这已经得到了很多次的回答,但我想在命令行上提供命令.换句话说假设我有目录:

> foo
>吧

我想进入

do-for * pwd

并在boo中打印工作目录然后在栏内打印.

从阅读网上的无数答案,我想我可以这样做:

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吧!

如何保持命令行上的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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读