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.6f1bash変数に値を設定する1行のコードを作成しようとしています。私はこれを試しましたが、foo=$(head -n 1 ProjectSettings/ProjectVersion.txt) | awk '{ print $2 }'エラーが発生しました(上記)。

答え1

次の方法で行うことができますawk

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

これは最初の行(NR==1)のみを考慮し、2番目の要素を印刷します。そして変数に代入

コメントで提案されているように、コマンドを単純化できます。

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 | awkhead

関連情報