将Shell脚本中的返回字符串设置为另一个Shell脚本中的变量

时间:2017-02-06 11:55:45

标签: bash

我正在尝试创建一个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'的输出才能使其正常工作?

1 个答案:

答案 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