パイプを使用した Bash 構文の問題

パイプを使用した Bash 構文の問題

プログラム(lynx)から返された値に変数を設定しようとしています。目標を達成するためにどの括弧または括弧を使用しているかはわかりません。

私はこれを持っています:

DEBFILE=${(lynx -listonly -dump https://gridtracker.org/release.html) | grep .deb | grep nwjs | awk '{ print $2 }'}

どうやってだますか?落ち着いてください。私はこれを台無しにしてからかなり時間が経ちました。

URLを含めるように説明を簡素化しました。最終的にこのコードブロック内でURL変数も使用したいと思います。

たとえば...

DEBFILE=${(lynx -listonly -dump ${GT_DOWNLOAD_LINK} ) | grep .deb | grep nwjs | awk '{ print $2 }'}

私はスクリプトの始めにすでに定義されているからです。

私はそれを行に分割し、コマンドをファイルにエコーしてから、そのように変数に戻すので、これが構文の問題であることを知っています。

これは効果があります

echo $(lynx -listonly -dump https://gridtracker.org/release.html | grep .deb | grep nwjs) | awk '{ print $2 }' >> temp.txt
        DEBFILE=$(cat temp.txt)
        echo $DEBFILE

ベストアンサー1

変数の拡張とコマンド置換の混乱により、入れ子になった構文エラーが発生した可能性があります。

達成したいことはコマンドの置き換えDEBFILE、つまり変数に割り当てたいと思います。出力コマンド。これは以下のように行われる。

DEBFILE=$( your command )

${ ... }初期試行で使用した構文は次のとおりです。パラメータ/変数拡張ここで、名前が中括弧で囲まれたシェル変数を「逆参照」することができます。これは${VARIABLE}デフォルトでと同じである$VARIABLEため、最初に表示されるコマンドに対してシェルは次の変数を見つけようとします。名前そしてその値を(1)(lynx -listonly -dump https://gridtracker.org/release.html) | grep .deb | grep nwjs | awk '{ print $2 }'に割り当てますDEBFILE

目標を達成する正しい方法は次のとおりです。

DEBFILE=$(lynx -listonly -dump https://gridtracker.org/release.html | grep .deb | grep nwjs | awk '{ print $2 }')

--pipeを次の単一のコマンドに置き換えることもできますgrepgrepawkawk

DEBFILE=$(lynx -listonly -dump https://gridtracker.org/release.html | awk '/\.grep/ && /nwjs/ { print $2 }')

または

DEBFILE=$(lynx -listonly -dump https://gridtracker.org/release.html | awk '(index($0,".deb") && index($0,"nwjs")) { print $2 }')

ノート「This Works」とマークされたコードは、基本的に私が提案したものと正確に一致します。echo出力をファイルに書き込み、そのファイルから変数を読み取るための不要な中間ステップだけを実行します$DEBFILE

  • echo $(lynx ... | grep .deb | grep nwjs)lynx ... | grep .deb | grep nwjsデフォルトでは、パイプのコンソール出力をパラメータlynx ... | grep ... | grep ...にしてecho単純にコンソールに(再び)印刷するため、同じ効果がありますが、不要な空白形式の上書きが発生する可能性があります。
  • echo $(lynx ... | grep .deb | grep nwjs) | awk '{ print $2 }'だから、lynx ... | grep .deb | grep nwjs | awk '{ print $2 }'

(1) Stéphane Chazelasが指摘したように、ksh93いくつかの形式のコマンド置換は実際にはサポートされていますが、コマンドは${ cmd; }aで終わる必要があり、;POSIXと互換性がなく、Bashはそれをサポートしません。

おすすめ記事