bash脚本中的意外输出。而不是文字"?",有回声" d"和"我"

时间:2017-03-26 17:05:30

标签: arrays bash awk grep ps

我有以下代码段:

#!/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"和"我"是由?

产生的

提前感谢您的回答。

2 个答案:

答案 0 :(得分:2)

不是使用命令替换的输出来填充你的shell数组int main() { while(1){ int integer; printf("enter integer:"); scanf("%d",&integer); } return 0; } (它需要进行全局扩展和单词吐出),你应该使用check进程替换,如下所示:

read

然后使用以下方法检查结果:

read -ra check < <(ps -e | awk -v p="$prg" '$0 ~ p{print "kILL " $4" "$1 " ? [y/n]"}')

答案 1 :(得分:0)

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]"

(顺便说一下,将问号与前一个词对齐,就像英语拼写中的惯例一样,也可以解决你的问题,虽然有点意外。请注意如何避免上面例子中的useless use of grep。 )