如何在Shell脚本中引用数组中的多个字符串值

时间:2016-06-26 10:40:46

标签: bash shell unix

我正在尝试在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 个答案:

答案 0 :(得分:1)

您需要使用命令替换,而不是引用命令:

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

我怀疑这会奏效,但还有很多工作需要进一步整理;您可以通过一次调用awk来完成所有要进行的过滤:

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

正如评论中所提到的,构建这样的数组存在潜在的风险(例如,*等全局字符将被扩展,并且您最终会在数组中获得额外的值)。更安全的选择是使用流程替换:

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