我正在尝试在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 }'
我应该如何将这些字符串值存储在变量中?
答案 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 }')