有没有shell高手帮忙看看?for FILE in apache-maven-*.tar.gz
是什么意思?EXISTS=$(aws s3 ls s3://lang-jvm/${NAME}.tar.gz --profile lang-jvm)
这个又是什么?
#!/usr/bin/env bash
# fail hard
set -o pipefail
# fail harder
set -eu
VENDOR_DIR=$(cd $(dirname $0); pwd)
TMPDIR=$(mktemp -d -t maven-build)
echo "---> Downloading sources..."
cd $TMPDIR
for MAVEN in $(cat ${VENDOR_DIR}/sources.txt)
do
echo " $MAVEN..."
curl -O --silent --location $MAVEN
done
for FILE in apache-maven-*.tar.gz
do
BUILD_DIR=build
NAME=$(echo $FILE | sed -e 's/.*\(maven-[0-9]*.[0-9]*.[0-9]*\).*/\1/g')
TARBALL=${NAME}.tar.gz
EXISTS=$(aws s3 ls s3://lang-jvm/${NAME}.tar.gz --profile lang-jvm)
if [ -z "$EXISTS" ]; then
echo "---> Building $NAME..."
mkdir -p $BUILD_DIR/.m2/repository
echo -n " Unpacking..."
tar xzvf $FILE -C $BUILD_DIR &> /dev/null
mv ${BUILD_DIR}/apache-maven* ${BUILD_DIR}/.maven
echo " done"
echo -n " Priming repository cache..."
cd $BUILD_DIR
cp $VENDOR_DIR/sample_pom.xml pom.xml
.maven/bin/mvn -B -Duser.home=$BUILD_DIR clean package verify install:help &> /dev/null
cd - &> /dev/null
echo " done"
echo -n " Packaging..."
tar -czvf ${TARBALL} -C ${BUILD_DIR} .maven .m2 &> /dev/null
echo " done"
echo -n " Uploading..."
aws s3 cp ${TARBALL} s3://lang-jvm --profile lang-jvm --acl public-read &> /dev/null
echo " done"
rm -rf $BUILD_DIR
else
echo "---> Skipping $NAME. Package already exists."
fi
done
# todo get rid of this and just pipe curl to tar
rm apache-maven-*
第一个是Bash通配符。在Bash中可以用通配符来匹配文件。表示匹配任意字符,所以apache-maven-.tar.gz表示(当前目录下)以apache-maven-开头,以.tar.gz结尾的所有文件。你可以试一下echo apache-maven-*.tar.gz
。把这个通配符放在for循环中,每次循环的时候会把这个匹配列表中的一项赋值给FILE。
第二个是Command Substitution。$(command)
表示command
命令的输出。这里执行的是aws命令。首先处理文件名,将文件名中的3组数字只保留第一组,然后用aws命令查看s3服务器上是否有这个文件,如果有这个文件的话,aws命令会有输出,EXISTS非空,如果没有这个文件,aws命令没有输出,EXISTS为空,通过-z参数判断EXISTS变量是否为空,如果为空,则制作出这个文件,并上传到服务器上。
第二个不知道什么意思,第一个就是一个简单的枚举循环:
for FILE in /usr/lib/liba*
do
echo $FILE
done
你把上面的代码写到脚本里面自己试试,再和下面这条命令对比一下:
ls /usr/lib/liba*