web-dev-qa-db-ja.com

コマンドの出力を変数に割り当てる

私はUNIXを初めて使い、シェルスクリプトを書いています。

コマンドプロンプトでこの行を実行すると、一致するプロセスの合計数が出力されます。

ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'

たとえば、上記の行の出力は、コマンドプロンプトでは2です。

上記の行(2)の出力が変数に割り当てられ、後でifステートメントでの比較に使用されるシェルスクリプトを記述したいと思います。

私は次のようなものを探しています

output= `ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'`
echo $output

しかし、それを実行すると、2が期待されているのに出力が見つからなかったと表示されます。

55
user3114665

次のような$記号を使用できます。

OUTPUT=$(expression)
99
Marutha

試してください:

output=$(ps -ef | awk '/siebsvc –s siebsrvr/ && !/awk/ { a++ } END { print a }'); echo $output

コマンドを$( )でラップすると、コマンド自体を「output」という名前の変数に設定しようとする代わりに、そのコマンドを実行するようシェルに指示されます。 (バックコマンド「コマンド」も使用できることに注意してください。)

コマンド置換の詳細については、 http://tldp.org/LDP/abs/html/commandsub.html を強くお勧めします。

また、1_CRがコメントで正しく指摘しているため、等号と割り当ての間に余分なスペースがあるため、コメントが失敗します。これは、私のマシンで発生している動作の簡単な例です。

jed@MBP:~$ foo=$(ps -ef |head -1);echo $foo
UID PID PPID C STIME TTY TIME CMD

jed@MBP:~$ foo= $(ps -ef |head -1);echo $foo
-bash: UID: command not found
UID PID PPID C STIME TTY TIME CMD
14
Jed Daniels

あなたが複数行/複数のコマンドでそれをしたい場合は、これを行うことができます:

output=$( bash <<EOF
#multiline/multiple command/s
EOF
)

または:

output=$(
#multiline/multiple command/s
)

例:

#!/bin/bash
output="$( bash <<EOF
echo first
echo second
echo third
EOF
)"
echo "$output"

出力:

first
second
third
8
Jahid