Bash 通过变量赋值读取文件的第一行

Bash 通过变量赋值读取文件的第一行

Unity 在名为“ProjectSettings/ProjectVersion.txt”的文件中有一个变量分配,但是当我尝试读取它时,它尝试运行并抛出错误。

文件的第一行是m_EditorVersion: 2021.3.6f1

% $(head -n 1 ProjectSettings/ProjectVersion.txt)
> zsh: command not found: m_EditorVersion:

我正在尝试提出一种将值设置2021.3.6f1为 bash 变量的单行代码。我已经尝试过foo=$(head -n 1 ProjectSettings/ProjectVersion.txt) | awk '{ print $2 }',但遇到了错误(上面)。

答案1

你可以用awk这种方式做到这一点:

foo=$(awk 'NR==1{ print $2 }' ProjectSettings/ProjectVersion.txt)

这仅考虑第一行 ( NR==1) 并打印第二个元素。并将其分配给变量

正如评论中所建议的,该命令可以简化:

foo=$(awk '{ print $2;exit }' ProjectSettings/ProjectVersion.txt)

答案2

你可以尝试这样的事情。使用 sed 抓取第一行,将“:”替换为简单的“=”等等......

$ cat foo.txt
m_EditorVersion: 2013.3.6f1
xxx: aaa
yyy: bbb
$ . <(sed -n '1{s/: /=/p}' foo.txt)
$ echo $m_EditorVersion
2013.3.6f1
$

答案3

罗密欧·尼莫夫的回答很好(单独使用 awk 比使用 head & awk 更好),@Paul_Pedant 评论中的变体也是如此,但它并没有告诉你命令的实际问题是什么。

你跑了:

foo=$(head -n 1 ProjectSettings/ProjectVersion.txt) | awk '{ print $2 }'

这里的问题是管道awk外部命令替换,因此无法修改输出head- 文件的整个未修改的第一行被分配给变量foo

同时,awk没有收到任何输入,因为所有输出都head被分配给 $foo。此外,命令替换不会捕获 awk 的任何输出,因此只会转到 stdout。

如果你想用 head 和 awk 来完成它,你会这样做:

foo=$(head -n 1 ProjectSettings/ProjectVersion.txt | awk '{ print $2 }')

请注意,命令替换的括号$()包围整个head | awk管道,而不仅仅是head命令。

相关内容