2017-02-06 29 views
-1

別のスクリプトの出力をチェックするシェルスクリプトを作成しようとしていますが、呼び出されたスクリプトから文字列を抽出する方法がわかりません。シェルスクリプトから別のシェルスクリプト内の変数に戻り文字列を設定する

私のコードは以下の通りです:私はターミナルで「SCRIPT_FILE」を実行した場合

#!/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 

は、私が期待し得る「エラーが見つかりませんでした。」 'NAME_1'と 'NAME_2'の両方のスクリプトファイルでは、 '$ outputCheck'は毎回空の文字列(初期化される文字列)なので、エラーを含まないにもかかわらず 'errorNames'配列に追加されます私の方法が良くないと思う理由がある。

「SCRIPT_FILE」の出力を取得して使用するにはどうすればよいですか?

+0

はなぜ単なる文字列が空の場合、テストは合格と失敗の場合していない、決定するために、後で配列とループにすべての出力状態を格納しませんか? – Inian

+0

@Inian問題は、 '$ outputCheck'(変数文字列)にパイプされているようではないので、配列にすべてのステータスを入れても空であり、したがって偽陽性のテストになります – LJH

答えて

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 
+0

ありがとう、これは働いた。一度それを見たら一目瞭然のようなものの一つ!ちょうど2つのことが、あなたのソリューションのifステートメントに大括弧で囲まれた角括弧を付け加えることができれば、そして私の質問がなぜ落とされたのかというアイデアは? (ちょうど私が試して改善することができます) – LJH

関連する問題