从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 请注意,此解决方案的优势在于,如果您的用户忘记了“ – ”分隔符,她将收到通知(而不是由于引用导致的失败). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |