shell脚本while循环触发器构建

时间:2016-11-23 14:31:56

标签: linux shell while-loop

我需要为某些特定项目触发构建,这些项目使用逗号分隔在文本文件中。

我写了一个shell脚本来拆分文件的内容,解压缩文件夹并导航到该文件夹​​。导航完成后,触发构建,这应该适用于所有项目路径。如果我在导航后在目录中列出文件,下面的脚本工作正常,但在执行gradle构建时,它只执行一次。

以下是我的shell脚本

CWD="$(pwd)"
INPUT=deploy.txt
OLDIFS=$IFS
IFS=","
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read f1
do
  echo "$f1 building...";
  (
    cd $f1;
    gradle clean b u;
    cd $CWD;

   )
  echo "Build over"

done <  $INPUT
IFS=$OLDIFS

此脚本有任何问题吗?请帮忙

1 个答案:

答案 0 :(得分:4)

这是推测性的(重定向gradle命令的标准输入),但我想利用这个机会修复脚本的其他一些问题。

INPUT=deploy.txt
# Consider exiting with status 1 instead of 99 unless you have
# a specific reason for using 99.
[ ! -f "$INPUT" ] && { echo "$INPUT file not found"; exit 99; }
while IFS=, read -r f1 rest
do
  echo "$f1 building..."
  pushd "$f1"
  gradle clean b u < /dev/null
  popd

  echo "Build over"

done < "$INPUT"

我假设您要更改IFS的值,以便从$INPUT分割读取的行;在这种情况下,您需要给read至少两个变量,以便将第一个字段分配给f1,并将该行的其余部分分配给另一个变量。同时使用pushdpopd比手动记录旧的工作目录更简单;因为你使用的是子shell,所以你无需使用CWD,因为第一个cd的效果只有在子shell退出之前才有效。

如果由于某种原因,gradle 需要访问标准输入,请使用不同的文件描述符从$INPUT读取。 (你可能会考虑这样做;你绝对知道<{em>} read应该从$INPUT读取,所以没有理由干涉gradle。 )

while IFS=, read -r f1 rest <&3; do
  echo "$f1 building..."
  pushd "$f1"
  gradle clean b u
  popd
done 3< "$INPUT"