2

我有许多 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使用每个脚本的输出来做自己的事情。我目前正在做什么(以上两个脚本都符号链接到 /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 ?

提前致谢!

4

1 回答 1

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'*}"
于 2013-03-09T13:05:08.180 回答