我正在尝试创建一个shell脚本来检查不同脚本的输出,但是我不确定如何从被调用的脚本中提取字符串。
我的代码如下:
#!/bin/bash
outputCheck=''
errorNames=()
echo 'Performing Test Checks on Cluster 2'
c2=('NAME_1' 'NAME_2')
for(( i=0; i<${#c2[@]}; i++ ));
do
echo 'Checking' ${c2[i]}
./scripts/SCRIPT_FILE.sh -v ${c2[i]} check | $outputCheck #this is the line that doesn't do what I expect
# expect '$outputCheck' to equal 'No errors found.' if okay
if [ "$outputCheck" != "No errors found." ];
then
echo $outputCheck
errorNames+=(${c2[i]})
else
# for testing code only
echo $outputCheck
fi
done
echo 'Check complete'
if [ "${#errorNames[@]}" != 0 ];
then
echo "The following tests had errors:"
for(( i=1; i<=${#errorNames[@]}; i++ ));
do
echo $i: ${errorNames[i-1]}
done
fi
如果我在终端中运行'SCRIPT_FILE',我会得到预期的'未找到错误'。对于'NAME_1'和'NAME_2',但是在我的脚本文件中,'$ outputCheck'每次都是一个空字符串(它初始化为什么),因此尽管没有包含错误,它们仍被添加到'errorNames'数组中,所以我有理由怀疑我的方法不好。
如何获取和使用'SCRIPT_FILE'的输出才能使其正常工作?
答案 0 :(得分:1)
管道用于将标准输出从一个进程传递到另一个进程的标准错误;您无法将输出直接传递给变量来执行赋值。
相反,请使用命令替换:
for f in "${c2[@]}"; do
outputCheck=$(./scripts/SCRIPT_FILE.sh -v "${f}" check)
if [[ $outputCheck != "No errors found." ]]; then
errorNames+=("$f")
fi
printf '%s\n' "$outputCheck"
done