我有一个文件file1
,其中包含以下内容:
Z
X
Y
我可以使用cat
查看文件:
$ cat file1
Z
X
Y
我可以对文件进行排序:
$ sort -k1,1 file1
X
Y
Z
我可以对它进行排序并将输出存储在变量中:
sorted_file1=$(sort -k1,1 file1)
但是当我尝试在变量cat
上使用sorted_file1
时,我收到错误:
$ cat "$sorted_file1"
cat: X
Y
Z: No such file or directory
我可以使用echo
它看起来是正确的,但它在我的脚本中表现得很奇怪:
$ echo "$sorted_file1"
X
Y
Z
为什么会这样?如何存储命令的输出会改变cat如何解释它?
有没有更好的方法将shell命令的输出存储在变量中以避免这样的问题?
答案 0 :(得分:1)
cat
对文件进行操作。您对cat(cat "$sorted_file1"
)的调用会扩展为与cat $'X\nY\nZ'
相同,当然也没有该名称的文件,因此您会看到错误。
Shell变量不是文件。如果您需要使其值像文件一样可用,则需要使用echo
来创建流:
echo "$sorted_file1" | cat # portable, STDIN
cat <(echo "$sorted_file1") # Bash, file
cat <<<"$sorted_file1" # Bash, STDIN
(显然cat
在这里毫无意义,但该原则适用于期望从文件或STDIN输入的其他程序。
答案 1 :(得分:0)
你混合了两个概念,文件和变量。这两种方法都有数据,但它们以不同的方式存在。
我会假设您知道文件是什么。变量就像一个小数据存储。
您通常使用变量来存储您可能想要更改的一些数据,立即使用并且不介意在脚本/程序结束时丢失。
您通常使用文件来存储脚本/程序结束后要保留的大量数据。
我相信你想要做的是对文件进行排序,并将输入存储在另一个文件中。为此,您需要使用重定向,如此
sort -k1,1 file1 > sorted_file1
这样做是对文件进行排序,然后将结果输出到名为“sorted_file1”的文件中。然后,如果您按常规cat sorted_file
进行操作,您将看到已排序的内容,如您所愿。
您可以阅读更多相关信息here。