对于循环,根据返回重复列表的数组中的列表,按名称检查字体



多亏了这里乐于助人的人,我大部分时间都在那里,但我仍然在挠头。。。我有一个字体列表,我需要确认是否安装在Mac上,作为构建后检查的一部分。我想要一个for循环来对${fontArray}中的每个项运行system_profiler命令。如果找不到字体,我想将$I添加到${missingFonts}中,以便在脚本完成后将其打印在报告中的一行上。如果找到了字体,我希望它只为其他一些变量设置值。稍后,我检查${missingFonts}是否为空,如果为空,则为通过,如果为否,则为失败,我想回显${misingFonts}的内容。这是我当前的代码。。。

Var19=Fonts
fontArray=("font1" "font2" "font3")
missingFonts=()
for i in "${fontArray[@]}"; do
system_profiler SPFontsDataType | grep "Full Name: $i" | sed 's/.*: //'
if ! system_profiler SPFontsDataType | grep -q "Full Name: $i";  then 
missingFonts+=( "$i" );
fi
done
if [ ${#missingFonts[@]} -eq 0 ]; then
Val19="Fonts Installed"
Check19=PASS
else
Val19="Missing Fonts: ${missingFonts[@]}"
Check19=FAIL
fi
Line19=" | ${Check19} | ${Var19}        = ${Val19} "
echo "$Line19"
exit0

由于这些不是我期望得到的字体:

FAIL | Fonts        = Missing Fonts: font1 font2 font 3

相反,我得到了:

| FAIL | Fonts      = Missing Fonts: font1 font2 font3 
font1 font2 font3

当我使用我知道的字体的实际名称时,我只会得到${fontArray}中的一长串字体,一次一个,并循环

realFont1
realFont2
realFont3
realFont1
realFont2

直到我打断。

我不明白为什么它在失败时打印两次名称,也不明白为什么当找到字体时,它只是一个接一个地打印字体并在列表中循环多次。我在这方面还是个新手,6个月前还勉强能说一句"你好,世界!",所以我很感激你的建议。

fontArray=("font1" "font2" "font3")
missingFonts=()
for i in "${fontArray[@]}"; do
if ! system_profiler SPFontsDataType | grep -q "Full Name: $i";  then 
missingFonts+=( "$i" );
fi
done
if [ ${#missingFonts[@]} -eq 0 ] ; then
Val19="Installed"
Check19=PASS
else
Val19="Missing Fonts: ${missingFonts[@]}"
Check19=FAIL
fi

最新更新