コマンドの出力をコマンドとしてBashにインポートするにはどうすればよいですか?


8

システム

Linux hosek 4.15.0-48-generic #51-Ubuntu SMP Wed Apr 3 08:28:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

問題

変数を格納するために、bashスクリプトでコマンドとして出力を取得する必要があります。

sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d'

このコマンドは次の行を返します。

email_sender='some@email.com'
email_recipients='another@email.com'

これらの出力/行をスクリプトのコマンドとしてどのように読み取り/実行できますか?この出力をファイルに保存してから、sourceコマンドのみで読み取りますか?

| sourceコマンドの最後で試しましたが、ファイルからしか読み取れません。

echo最初は試しましたが効果がありませんでした。

ありがとう。

回答:


15

以下のようpLumoがあなたを示し、あなたは確かにすることができsource、それらを。ただし、これはお勧めしません。このようなものがあれば:

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')

echo "$email_sender"

その後、1年後に戻ってこのスクリプトを見ると、このemail_sender変数の出所がわかりません。代わりにコマンドを変更し、変数の値のみを返し、名前を返さないものを使用することをお勧めします。このようにして、各変数がどこから来たかを簡単に追跡できます。

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)

私はこれがより良いことに同意します;-)少なくともあなたが後で使用するつもりのスクリプトのために。
pLumo

両方のおかげで!素敵でシンプル。;)
genderbee

2つはこれで問題ありfor var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneませんが、私が間接的にforループを使用している場合は、次のようになります。
法律29

3

プロセス置換を使用できます。

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')

0
#!/bin/bash

declare -A data
while IFS='=' read -r key value; do
    data[$key]=${value//\'/}
done < <(grep -E '^([^#].+=.*)' webcheck-$category.cfg)

または

done < <(sed -n '/# Main configuration./,/# Websites./{//!p}' webcheck-$category.cfg)
# associative array.
echo ${data[email_sender]}
echo ${data[email_recipients]}

出力:

some@email.com another@email.com


-1

組み込みのbash読み取りは、このようなことをうまく処理します。

read -d '' -r email_sender email_recipients < <(
  grep -oP 'email_sender=\K.*' webcheck-$category.cfg; 
  grep -oP 'email_recipients=\K.*' webcheck-$category.cfg
)

readstdinから行を変数に読み込みます。-d ''改行を除いて、空白の分割をオフにします。エスケープを-r無効にします\

cmdA < <(cmdB)cmdBと同様に機能します。cmdAは、以前の場合を除き、サブシェルではなく〜this〜シェルで実行されます。これは、読み取りが期待どおりに機能するために必要です。


1
ラインのさまざまな部分について説明してもらえますか?
Simon Sudler

これは本当ですが、目的がどこからファイルから読み取るのかという質問にどのように関連していますvar=valueか?
terdon
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.