以下の内容を含むフラットファイルデータベース(ff_servers.db)があります。
192.168.154.2 Alaska hp
192.168.157.3 Colorado dell
192.168.156.3 hawaii hp
コマンドラインから次を実行できます。
awk "BEGIN{IGNORECASE=1;}/alaska/ {print $NF}" ff_servers.db`
私は得るでしょう
hp
ただし、Bashスクリプトでは「$ NF」の問題が発生します。そのスクリプトのダンプは次のとおりです。
machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \$NF}" ff_servers.db`
awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print $NF}" ff_servers.db
++ awk 'BEGIN{IGNORECASE=1;}/colorado/ {print }' ff_servers.db
+ target_arch='192.168.157.3 Colorado dell'
明らかに$ NFは正しく翻訳されていません。私は何が間違っていましたか?
答え1
$
"
Bashは二重引用符で変数を拡張します。
コマンドラインからインタラクティブにこれを行うときも問題になります。 BashはExpandを試み、"$NF"
変数が定義されていない場合、Bashはそれを空の文字列に展開します。NF
'
通常、一重引用符を使用して$NF
bashが拡張されないようにすることができます。
しかし、拡張したいので、二重${server_name}
脱出を試してみることができます。
machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \\$NF}" ff_servers.db`
文字列連結を試すこともできます。違いは主にスタイルにあります。
machine_type=`awk 'BEGIN{IGNORECASE=1;}/'${server_name}'/{print $NF}' ff_servers.db`
これは、bashが隣接する文字列を一緒に連結するためです。