2016-06-26 21 views
0

forループで複数の文字列を格納しようとしていますが、 私のコードは次のとおりです。シェルスクリプトの配列内の複数の文字列値を参照する方法

#!/bin/bash 
declare -a arr=("ps -ef | grep icsmpgum | grep $USER | grep -v grep | awk '{print $9,$8}' | awk '{print $1}'") 

for i in "${arr[@]}"  
do 
    echo "$i" 
done 

ps -ef | grep icsmpgum | grep $USER | grep -v grep | awk '{print $9,$8}' | awk '{print $1}' 

の出力は次のとおりです。

icsmpgum  
ABC 
DEF 

私はループのためではなく、forループを適用した後、これらの3つの文字列の値を参照したいです上記のように私に出力を与える:

出力:

ps -ef | grep icsmpgum | grep tsaprm1 | grep -v grep | awk '{print ,}' | awk '{print }' 

私は変数でこれらの文字列値を格納する必要がありますどのように?

答えて

1

あなたはむしろ、コマンドを引用よりも、コマンド置換を使用する必要があります。

arr=($(ps -ef | grep icsmpgum | grep $USER | grep -v grep | awk '{print $9,$8}' | awk '{print $1}')) 

私はこれが動作すると思われるが、さらに行われるように片付けがたくさんあります。あなたがしたいすべてのフィルタリングはAWKに1回の呼び出しで可能です:コメントで述べたように

arr=($(ps -ef | awk -v user="$USER" '!/awk/ && /icsmpgum/ && $0 ~ user { print $9 }')) 

、このような配列を構築するための潜在的なリスクがあります(例えば*として例えばグロブ文字が拡大されるだろうし、あなたは配列に余分な値で終わるだろう)。

+0

これにより、コマンド名の出力がパス名展開されますが、これは問題ではないかもしれませんが、 'read -ra arr < <(ps ....) ' – andlrc

+0

@andlrcフェアポイント - 私は編集しました。 –

関連する問題