在bash脚本中循环使用变量

时间:2014-04-14 15:22:52

标签: bash shell

我使用post-receive git hook部署我的网站。在该钩子中,我使用YUI压缩器来缩小js和css文件:

export TEMP=/var/www/example.com
GIT_WORK_TREE=/var/www/example.com git checkout master -f
#Minify mit YUI
(cd $TEMP/css && min style.css && rm style.css && mv style.min.css style.css)
(cd $TEMP/addons/css && min bootstrap.css && rm bootstrap.css && mv bootstrap.min.css 
(cd $TEMP/js && min script.js && rm script.js && mv script.min.js script.js)
(cd $TEMP/addons/js && min startup.js && rm startup.js && mv startup.min.js startup.js)

现在我想不指定确切的文件,而是通过$ TEMP中的所有文件夹搜索所有js和css文件,并且每次都重复minify过程。

对于这种情况,任何人都可以帮助我使用正确的循环和搜索语法吗? 谢谢!

2 个答案:

答案 0 :(得分:3)

这里只是一个猜测,但是这样的构造呢?

find $TEMP -name \*.css -exec sh -c 'f="{}"; min "$f" && mv "${f%.css}.min.css" "$f"' \;

我们的想法是find命令找到所有CSS文件,然后执行minmv命令。无需rm,因为mv会覆盖。

您可以找出JavaScript文件的等效行。 : - )

请注意,我没有对此进行测试,因为我不使用min,但这不是关于缩小或YUI的问题,这是关于如何在多个文件中执行命令的问题目录树。

<强>更新

您可以通过在find条件中添加额外的逻辑来跳过某些文件:

find $TEMP -name \*.js -and -not -name \*.min.js -exec ...

答案 1 :(得分:-1)

在使用bash终端的单个命令行中:

TEMP="/var/www/example.com"; pwd="$PWD"; IFS=$'\n'; for f in `find $TEMP -name "*.js" -or -name "*.css"`; do dir=`dirname $f`; cd "$dir"; min "$f"; ext="${f##*.}"; f2=`echo $f | sed "s/$ext$/min\.$ext/g"`; rm -f "$f"; mv "$f2" "$f"; done; cd "$pwd"

或者如果你把它放在sh文件中,那么:

#!/bin/bash
TEMP="$1";

IFS=$'\n'; 
for f in `find $TEMP -name "*.js" -or -name "*.css"`; do 
    dir=`dirname $f`
    cd "$dir"
    min "$f"
    ext="${f##*.}"
    f2=`echo $f | sed "s/$ext$/min\.$ext/g"` 
    rm -f "$f"
    mv "$f2" "$f" 
done

并以路径作为参数调用脚本或直接将其硬编码到文件中。

上述算法负责js和css文件。它移动到文件所在的目录中,并在原始命令所在的目录中创建临时文件。即使文件或目录名中有空格,或者文件名称中包含子字符串.js或.css,也不仅仅是扩展名,它也应该有效。