我正在尝试设置一个脚本,该脚本将在文件树的多个目录中调用代码扫描程序。代码扫描器分两个步骤(“ make”构建和扫描),它们需要一些参数。我想将其简化为一步,它将自动切换目录并运行两步扫描。
我的问题是,当我的脚本遍历目录列表(在脚本中预定义)时,它会尝试检测目录的存在,但是会不断出现一个不存在的错误。我调用了“ if [-d]”,但是失败时,它会继续进入语句的ELSE部分。
我查看了如何遍历子目录数组,并尝试了几种不同的遍历方法。我还尝试更改目录以及如何访问脚本中的变量。我看了几个Stack Overflow的答案,但这些也无济于事。
作为脚本的一部分,我调用一个函数,该函数分析文件以找到另一个目录,然后在构建完成之前将其更改为该目录。该目录是生成的位置。然后在另一个目录中进行扫描。我正在即时切换到这些目录。我仔细检查了局部变量,并尝试更改函数中返回变量的返回方式。一切都没有运气。
这是我大部分的脚本。我尽力将其蒸馏掉。
declare -a SCANDIRS=("atpsw" "emsw" "lssw")
SRCHOME=`pwd`
CONFIGFILE='scan.properties'
function get_build_dir()
{
while read -r line
do
set -- `echo $line | tr '=' ' '`
local key=$1
local value=$2
if [ "$key" == "scan.sources" ]
then
break
fi
done < "$CONFIGFILE"
#return the value as a string
echo "$value"
}
for i in ${SCANDIRS[@]}
do (
if [ -d "$i" ]
then
echo "SRCHOME DIR: $SRCHOME"
echo "Scanning $i ..."
cd "$i"
if [ -f "$CONFIGFILE" ]
then
echo "Property File Exists"
# Switch this comment to make it work
todir="$(get_build_dir)"
#todir="src"
builddir="$PWD/${todir}"
echo "Switching to directory: ${builddir}"
if [ -d ${builddir} ]
then
cd ${builddir}
echo `pwd`
else
echo "--->>>> ${builddir} does not exist"
fi
else
echo "Property File does not exist"
fi
cd "${SRCHOME}"
echo `pwd`
echo
fi
) done
我得到的输出是:
SRCHOME DIR: /home/sorton/src/LWSD
Scanning atpsw ...
Property File Exists
Switching to directory: /home/sorton/src/LWSD/atpsw/.
--->>>> does not existc/LWSD/atpsw/.
/home/sorton/src/LWSD
SRCHOME DIR: /home/sorton/src/LWSD
Scanning emsw ...
Property File Exists
Switching to directory: /home/sorton/src/LWSD/emsw/src
--->>>> does not existc/LWSD/emsw/src
/home/sorton/src/LWSD
SRCHOME DIR: /home/sorton/src/LWSD
Scanning lssw ...
Property File Exists
Switching to directory: /home/sorton/src/LWSD/lssw/./ls
--->>>> does not existc/LWSD/lssw/./ls
/home/sorton/src/LWSD
对于每个循环,“扫描...”目录更改为阵列项目之一。检查并分析属性文件,然后检查构建目录,每次都会失败。您会在输出中的箭头上注意到,字符串出现乱码,被截断并且乱序。我必须添加箭头,因为它们没有在运行时打印出来。
我将问题缩小到调用函数并返回要切换到的目录。在“ cd”到该目录之前先检查该目录。如果我注释掉获取“ todir”值的函数调用并将其替换为紧随其后的行,则脚本将按预期工作。
我知道我可能可以让MAKE来完成这项工作,但是这个问题确实让我感到困扰,我想深入探究这个问题,以防万一它再次出现。
很抱歉,这似乎很长。对这个有趣问题的任何见解将不胜感激。