如何将shell命令的输出捕获到变量中

时间:2017-05-18 19:26:49

标签: shell unix sh

当运行像tar这样的命令来解压缩tar文件时,包含的文件会显示在stdout上,我该如何解析它并在不同的变量中捕获它们

tar -xvf testfile.tar 
dir/file1.txt 
dir/file2.txt

我想在var file1中存储file1.txt名称,在var file2中存储file2.txt。

2 个答案:

答案 0 :(得分:0)

这是一种方法

count=1
for i in $(tar -tzf testfile.tar); do eval "file${count}=$i"; count=$((count+1)); done

它会给你这样的东西:

file1=dir/
file2=dir/file2.txt
file3=dir/file1.txt

在我的例子中,我创建了一个dir文件夹,在技术上并不是你的第一行dir /

答案 1 :(得分:0)

如果您的问题被标记为shell unix sh,那么您的问题会请求符合 POSIX shell 的答案,但您在评论中的回答表明您是在 bash (或其他支持数组的shell)中工作。根据您的shell,标记会对您将收到的答案以及将(或不会)为您起作用的答案产生影响。 (正如@Inian正确指出的那样)

如果您正在使用支持数组的shell(bash,ksh,zsh等),捕获tar -xvf testfile.txt命令输出的最简单方法是使用命令替换填充数组,例如

array=( $(tar -tvf testfile.tar) )

如果您需要POSIX shell解决方案(Bourne shell,dash等),那么您需要管道tarread的输出或重定向它输出到一个临时文件,read从那里输出。您可以使用类似于以下内容的内容,

tar -tvf testfile.tar | while IFS="\n" read -r fname
do
    printf "found: %s\n" "$fname"
done

或者,如果您想使用临时文件,请执行以下操作:

tar -tvf testfile.tar > tempfile.txt
while IFS="\n" read -r fname
do
    printf "found: %s\n" "$fname"
done <"tempfile.txt"
rm tempfile.txt

注意:取决于您的操作系统和read的实施情况,您可能有{可能} {%}}可能没有-r选项。如果您的实现没有提供,请简单省略。

很高兴你能够解决这个问题。如果您有任何其他问题,请告诉我们。

相关问题