我有一个脚本“ myscript”,它输出以下内容:
abc
def
ghi
在另一个脚本中,我称:
declare RESULT=$(./myscript)
并$RESULT
获得价值
abc def ghi
是否可以用换行符或'\ n'字符存储结果,以便我可以用' echo -e
' 输出结果?
我有一个脚本“ myscript”,它输出以下内容:
abc
def
ghi
在另一个脚本中,我称:
declare RESULT=$(./myscript)
并$RESULT
获得价值
abc def ghi
是否可以用换行符或'\ n'字符存储结果,以便我可以用' echo -e
' 输出结果?
Answers:
实际上,RESULT包含您想要的内容-演示:
echo "$RESULT"
您显示的是您从中得到的:
echo $RESULT
如评论中所指出的,不同之处在于(1)变量()的双引号版本echo "$RESULT"
保留了值在变量中所表示的内部间距-换行符,制表符,多个空格和所有空格-而(2 )未加引号的版本(echo $RESULT
)将一个或多个空格,制表符和换行符的每个序列替换为一个空格。因此,(1)保留输入变量的形状,而(2)创建一个可能很长的单行输出,其中“单词”由单个空格分隔(其中“单词”是非空白字符的序列;需要不能是任何字母数字)。
与此另一个缺陷是,命令替换 - $()
-带拖尾换行符。可能并不总是很重要,但是如果您确实想准确保留输出的内容,则必须使用另一行和一些引号:
RESULTX="$(./myscript; echo x)"
RESULT="${RESULTX%x}"
如果要处理所有可能的文件名,这尤其重要(以避免发生未定义的行为,例如对错误的文件进行操作)。
如果您对特定的行感兴趣,请使用结果数组:
declare RESULT=($(./myscript)) # (..) = array
echo "First line: ${RESULT[0]}"
echo "Second line: ${RESULT[1]}"
echo "N-th line: ${RESULT[N]}"
readarray
和处理替换而不是命令替换:readarray -t RESULT < <(./myscript>
。
除了通过给出的答案@ l0b0我只是在那里我需要两个情况保留任何尾随的换行符输出的脚本,并检查脚本的返回码。而l0b0的答案的问题是'echo x'正在重置$?回到零...所以我设法提出了这个非常狡猾的解决方案:
RESULTX="$(./myscript; echo x$?)"
RETURNCODE=${RESULTX##*x}
RESULT="${RESULTX%x*}"
die ()
可以接受任意退出代码和可选消息的usage ()
函数,并且我想使用另一个函数来提供消息,但是换行符不断被压缩,希望这可以让我解决这个问题。
在这里尝试了大多数解决方案之后,我发现最容易的事情是显而易见的-使用临时文件。我不确定要对多行输出进行处理,但是可以使用read逐行处理它。您唯一不能真正做的就是轻松地将所有内容都放在同一个变量中,但是对于大多数实际目的而言,这很容易处理。
./myscript.sh > /tmp/foo
while read line ; do
echo 'whatever you want to do with $line'
done < /tmp/foo
快速修改以使其执行请求的操作:
result=""
./myscript.sh > /tmp/foo
while read line ; do
result="$result$line\n"
done < /tmp/foo
echo -e $result
请注意,这会增加一行。如果您使用它,则可以围绕它进行编码,我太懒了。
编辑:虽然这种情况下效果很好,但阅读此书的人们应该意识到,您可以轻松地在while循环内压缩标准输入,从而为您提供一个脚本,该脚本将运行一行,清除标准输入,然后退出。像ssh一样,我认为呢?我最近才看到它,这里还有其他代码示例:https : //unix.stackexchange.com/questions/24260/reading-lines-from-a-file-with-bash-for-vs-while
再一次!这次使用不同的文件句柄(stdin,stdout,stderr为0-2,因此我们可以在bash中使用&3或更高版本)。
result=""
./test>/tmp/foo
while read line <&3; do
result="$result$line\n"
done 3</tmp/foo
echo -e $result
您也可以使用mktemp,但这只是一个快速的代码示例。mktemp的用法如下:
filenamevar=`mktemp /tmp/tempXXXXXX`
./test > $filenamevar
然后像使用文件的实际名称一样使用$ filenamevar。可能不需要在这里解释,但是有人在评论中抱怨。
怎么样,它将每一行读入一个变量,可以随后使用!说myscript输出重定向到名为myscript_output的文件
awk '{while ( (getline var < "myscript_output") >0){print var;} close ("myscript_output");}'