首页 > shell脚本的问题

shell脚本的问题

有没有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*
【热门文章】
【热门文章】