如何将shell命令的输出捕获到变量中
当运行像tar这样的命令来解压缩tar文件时,包含的文件显示在stdout上,如何解析它并在不同的变量中捕获它们如何将shell命令的输出捕获到变量中,shell,unix,sh,Shell,Unix,Sh,当运行像tar这样的命令来解压缩tar文件时,包含的文件显示在stdout上,如何解析它并在不同的变量中捕获它们 tar -xvf testfile.tar dir/file1.txt dir/file2.txt 我想将file1.txt名称存储在var file1中,将file2.txt存储在var file2中。这里有一种方法 count=1 for i in $(tar -tzf testfile.tar); do eval "file${count}=$i"; count=$((c
tar -xvf testfile.tar
dir/file1.txt
dir/file2.txt
我想将file1.txt名称存储在var file1中,将file2.txt存储在var file2中。这里有一种方法
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文件夹,因此是第一行dir/,您的问题被标记为
shell
sh
,您的问题请求一个符合POSIX shell的答案,但是您在注释中的响应表明您正在使用bash(或其他支持数组的shell)。根据您的shell,标记会对您收到的答案以及对您有效(或无效)的答案产生影响。(正如@Inian正确指出的)
如果您在支持数组(bash、ksh、zsh等)的shell中工作,那么捕获tar-xvf testfile.txt
命令输出的最简单方法是使用命令替换填充数组,例如
array=( $(tar -tvf testfile.tar) )
如果您需要POSIX外壳解决方案(Bourne外壳、dash等),则您需要将输出从tar
传输到read
或将其输出重定向到临时文件,然后从那里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
tar-tvf testfile.tar>tempfile.txt
而IFS=“\n”读取-r fname
做
printf“找到:%s\n”“$fname”
使用进程替换或命令替换重定向输出并将其捕获到索引数组中?(例如数组=($(tar-tvf testfile.tar))
)酷..那works@DavidC.Rankin:AFAIK,processsubstitution
不是一个POSIX
shell特性,引用这一点只是因为问题中的sh
标记我不支持bash,array=$(tar-xvf testfile.tar)在循环中读取然后您基本上需要使用管道或tmp文件,例如,tar-tvf testfile.tar,而IFS=$'\n'read-r fname;do printf“found:%s\n”“$fname”;done
或重定向输出tar-tvf testfile.tar>tmpfile&&while IFS=$'\n'read-r fname;do printf“found:%s\n”“$fname”;这样做也可以,但第一个不是dirname,tar不回显dir name我只是想澄清一下,我在文件夹中添加了file1和file2,这就是为什么它会出现在我的输出中。您无法安全地使用无引号的命令替换创建数组。IFS=“\n”
在n
上拆分输入,而不是换行符。实际上,您需要IFS=
,这样就不会在读取的
从输入中获取的单行上执行分词操作。您在哪里看到为数组设置的IFS
呢?没有关于IFS
和数组的讨论。IFS
只是讨论一下由于它与POSIX相关,请阅读
。请不要捏造文字来证明否决投票是正当的。请注意,如果您需要POSIX外壳解决方案,请从第三段开始。谢谢。IFS
是一个单独的问题,即使对于POSIX解决方案也是错误的。数组=($(tar…)如果任何文件名包含空格,则
将不起作用;组件将被视为数组中的独立元素。我同意这一点。但这不是答案的一部分。一个简单有用的注释,指出在进程替换之前可以包含防止单词分裂的IFS=
对彼此的答案吹毛求疵——这真的不会继续是一个有用的网站了。