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
로미오 니모프의 답변@Paul_Pedant의 의견에 있는 변형과 마찬가지로 괜찮습니다(awk만 사용하는 것이 head & awk를 사용하는 것보다 낫습니다). 그러나 명령의 실제 문제가 무엇인지는 알려주지 않습니다.
당신은 다음을 실행했습니다 :
foo=$(head -n 1 ProjectSettings/ProjectVersion.txt) | awk '{ print $2 }'
여기서 문제는 파이프 awk
가외부~의명령 대체따라서 출력을 수정할 수 없습니다 head
. 파일의 수정되지 않은 첫 번째 줄 전체가 변수에 할당됩니다 foo
.
동시에 모든 출력이 $foo에 할당되므로 awk
입력이 수신되지 않습니다 . head
또한 명령 대체는 awk의 출력을 캡처하지 않으므로 stdout으로만 이동합니다.
head와 awk를 사용하여 이를 수행하려면 다음을 수행하십시오.
foo=$(head -n 1 ProjectSettings/ProjectVersion.txt | awk '{ print $2 }')
명령 대체를 위한 대괄호는 명령 뿐만 아니라 $()
전체 파이프를 둘러쌉니다 .head | awk
head