2013-03-09 181 views
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 /網絡/ thisisatest和/ var /日誌/ 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和使用腳本每個人的輸出做自己的東西。什麼我目前做的(上述兩種腳本符號鏈接到/ usr/local/bin目錄,而不.sh部分並提出可執行文件):

#!/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下一個步驟。我知道這是因爲管道在子shell中運行它,但是我所見過的所有示例都涉及到文件而不是命令,而且我無法使其工作。我試圖通過管道將echo到「下一步」,如

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

如何運行stepA並有PTH變量可供以後? 是否有一種「更好的方式」從嵌套if s中提取我需要的路徑?

在此先感謝!

+0

+1對於格式化良好的問題以及對您的問題很明顯的工作。但是......很難理解我們如何提供幫助。當前流程的一些實際輸出可能會有所幫助,另外還有一些預期輸出,既可以作爲最終輸出,也可以作爲步驟A和步驟B的中間輸出中所看到的內容。另外我還不清楚,如果你只是想讓PTH的值在stepA-> B之間通過,或者你是否希望步驟B有一個$ PTH變量(帶有一個值),那麼它已經從stepA「繼承」了。祝你好運! – shellter 2013-03-09 14:06:44

回答

4

由於您使用bash明確(在shebang行),你可以使用它的過程中替換功能,而不是管:

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'*}" 
+0

這會做得很好,謝謝。第二種方法實際上看起來「更清潔」。 – hexblot 2013-03-10 13:28:54