Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将shell命令的输出捕获到变量中_Shell_Unix_Sh - Fatal编程技术网

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

如何将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这样的命令来解压缩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=$((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=
对彼此的答案吹毛求疵——这真的不会继续是一个有用的网站了。