我有以下代码片段:
#!/bin/bash
clear
echo "PS to AWK"
read prg
check=($(ps -e | grep $prg | awk '{print "kILL " $4" "$1 " ? [y/n]"}'))
echo "${check[@]}"假定的产出应是:
PS to AWK
auda
kILL audacious 2423 ? [y/n]但不幸的是,我的输出如下所示:
PS to AWK
auda
kILL audacious 2423 d i [y/n]有人暗示为什么问号会丢失,"d“和"i”是从哪里产生的?
提前谢谢你的回答。
发布于 2017-03-26 17:27:53
与其使用命令替换的输出填充shell数组,不如使用check和进程替换(这需要进行字词扩展和词吐),如下所示:
read -ra check < <(ps -e | awk -v p="$prg" '$0 ~ p{print "kILL " $4" "$1 " ? [y/n]"}')然后使用以下方法检查结果:
echo "${check[@]}"
# or
declare -p check发布于 2017-03-26 17:09:26
未引用的?由shell作为通配符展开。在当前目录中有两个具有单字符名称的文件。
修复通常是引用所有内容,除非您特别要求shell对值执行通配符扩展和空格标记。
通配符在数组赋值中被展开,因此您可以引用:
check=("$(ps -e | awk -v prg="$prg" '$0 ~ prg {print "kILL " $4" "$1 " ? [y/n]"}')")但是你可能不用数组了。但你最好还是抓住PID。
pid=$(ps -e | awk -v prg="$prg" '$0 ~ prg { print $1 }')不过,这会丢失进程名。您可以重构脚本,只打印机器可读的部分,然后在打印语句中使用这些部分。
check=($(ps -e | awk -v prg="$prg" '$0 ~ prg { print $1, $4 }'))
read -p "kILL ${check[1]} ${check[0]}? [y/n]"(顺便说一句,将问号与前一个单词对齐,就像英语拼写中的惯例一样,也会解决你的问题,尽管有点意外。还请注意如何避免上述示例中的grep。)
https://stackoverflow.com/questions/43031839
复制相似问题