如何将多行输出从管道传递到bash中的变量?而不使用临时文件



我有一个复杂的grep/awk/etc命令行,它已经使用了一些"some$var",这使得它甚至不可能使用

VAR="$( that command )" 

获取所有输出

我不想创建临时文件,这会让它变得更难看,

是否可以将管道输出传递到bash 中的变量中

command   |   > $VAR

只需使用:VAR=$(complex command ),就可以像在下一行中一样编写complex command

例如:如果你有

foo=1
bar="2 3"
awk -v myfoo="$foo" -v mybar="$bar" '..... complex 
                                          awk 
                                          script here .....'

你可以用将其输入VAR

foo=1
bar="2 3"
VAR="$( awk -v myfoo="$foo" -v mybar="$bar" '..... complex 
                                                   awk 
                                                   script here .....' )"

也就是说,一旦进入$(…),bash就会像在"第一级"一样阅读东西。它的工作原理是在对包含$(…)的行求值之前先对其求值。

您可以按如下方式执行for循环(只是一个警告,用于按空间分割输出的循环。因此,您将通过迭代获得一个单词):

    #!/usr/bin/ksh
    for RC_OUTPUT in $(./testEcho.ksh)
    do
        echo $RC_OUTPUT
    done

这里是一个更复杂的解决方案(最大线路长度=80):#/usr/bin/ksh

    LINE_LENGTH_MAX=80
    LINE_LENGTH=0
    for RC_OUTPUT in $(./testEcho.ksh)
    do
        CURRENT_LENGTH="$(expr length $RC_OUTPUT)" 
        (( LINE_LENGTH = LINE_LENGTH + CURRENT_LENGTH + 1 ))
        if [[ $LINE_LENGTH -gt $LINE_LENGTH_MAX ]]
        then
            LINE_LENGTH=$CURRENT_LENGTH
            echo $RC_OUTPUT
        else
            echo -n "$RC_OUTPUT "
        fi
    done

最新更新