2

私はいくつかの bash スクリプトを持っており、それぞれが独自のことを楽しく行っています。私は他の言語でプログラミングしていますが、自動化には Bash しか使用しておらず、Bash はあまり得意ではありません。

私は現在、それらのいくつかを組み合わせて、他のスクリプトをステップとして使用する「メタ」スクリプトを作成しようとしています。問題は、各ステップの出力を解析して、その一部をパラメーターとして次のステップに渡すことができるようにする必要があることです。

例:

stepA.sh

[...does stuff here...]
echo "Task complete successfuly"
echo "Files available at: $d1/$1"
echo "Logs available at: $d2/$1"

上記はどちらも /var/www/thisisatest や /var/log/thisisatest などのパスです (ファイルは常に /var/www で始まり、ログは常に /var/log で始まることに注意してください)。私はファイルパスにのみ興味があります。

steB.sh

[...does stuff here...]
echo "Creation of $d1 complete."
echo "Access with username $usr and password $pass"

ここのすべての変数は単純な文字列で、特殊文字 (スペースなし) を含む場合があります

私が構築しようとしているのは、 を実行し、それぞれの出力を使用して独自のものを実行するスクリプトstepA.shですstepB.sh。私が現在行っていること (上記の両方のスクリプトは、.sh一部なしで /usr/local/bin にシンボリックリンクされ、実行可能になっています):

 #!/bin/bash

 stepA $1 | while read -r line; do
 # Create the container, and grab the file location
 # then pass it to then next pipe
   if [[ "$line" == *:* ]]
   then
     POS=`expr index "$line" "/"`
     PTH="/${line:$POS}"
     if [[ "$PTH" == *www* ]]
     then
       #OK, have what I need here, now what?
       echo $PTH;
     fi
   fi
done 

# Somehow get $PTH here

stepB $1 | while read -r line; do
 ...
done

#somehow have the required strings here

PTH次のステップに進むのに行き詰まっています。これは、パイピングがサブシェルで実行されるためだと理解していますが、私が見たすべての例はコマンドではなくファイルを参照しており、これを機能させることができませんでした。echo次のような「次のステップ」にパイプしてみました

stepA | while ...
    echo $PTH
done | while ...
 #Got my var here, but cannot run stuff
done

変数を実行stepAして、後で使用できるようにするにはどうすればよいですか? PTHネストされた s よりも出力から必要なパスを抽出する「より良い方法」はありifますか?

前もって感謝します!

4

1 に答える 1

4

bash を (シバン行で) 明示的に使用しているため、パイプの代わりにそのプロセス置換機能を使用できます。

while read -r line; do
    if [[ "$line" == *:* ]]
        .....
    fi
done < <(stepA $1)

または、コマンドの出力を文字列変数にキャプチャし、それを解析することもできます。

output="$(stepA $1)"
tmp="${output#*$'\nFiles available at: '}" # output with everything before the filepath trimmed
filepath="${tmp%%$'\n'*}" # trim the first newline and everything after it from $tmp
tmp="${output#*$'\nLogs available at: '}"
logpath="${tmp%%$'\n'*}"
于 2013-03-09T13:05:08.180 に答える