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
命令。