我有以下代码段:
#!/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"和"我"是由?
产生的提前感谢您的回答。
答案 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
。 )