首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash脚本中的意外输出。而不是字面上的"?",而是回音的"d“和"i”。

bash脚本中的意外输出。而不是字面上的"?",而是回音的"d“和"i”。
EN

Stack Overflow用户
提问于 2017-03-26 17:05:29
回答 2查看 108关注 0票数 0

我有以下代码片段:

代码语言:javascript
复制
#!/bin/bash
clear
echo "PS to AWK"

read prg

check=($(ps -e | grep $prg | awk '{print "kILL " $4" "$1 " ? [y/n]"}'))

echo "${check[@]}"

假定的产出应是:

代码语言:javascript
复制
PS to AWK
auda
kILL audacious 2423 ? [y/n]

但不幸的是,我的输出如下所示:

代码语言:javascript
复制
PS to AWK
auda
kILL audacious 2423 d i [y/n]

有人暗示为什么问号会丢失,"d“和"i”是从哪里产生的?

提前谢谢你的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-26 17:27:53

与其使用命令替换的输出填充shell数组,不如使用check和进程替换(这需要进行字词扩展和词吐),如下所示:

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

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

代码语言:javascript
复制
echo "${check[@]}"

# or
declare -p check
票数 2
EN

Stack Overflow用户

发布于 2017-03-26 17:09:26

未引用的?由shell作为通配符展开。在当前目录中有两个具有单字符名称的文件。

修复通常是引用所有内容,除非您特别要求shell对值执行通配符扩展和空格标记。

通配符在数组赋值中被展开,因此您可以引用:

代码语言:javascript
复制
check=("$(ps -e | awk -v prg="$prg" '$0 ~ prg {print "kILL " $4" "$1 " ? [y/n]"}')")

但是你可能不用数组了。但你最好还是抓住PID。

代码语言:javascript
复制
pid=$(ps -e | awk -v prg="$prg" '$0 ~ prg { print $1 }')

不过,这会丢失进程名。您可以重构脚本,只打印机器可读的部分,然后在打印语句中使用这些部分。

代码语言:javascript
复制
check=($(ps -e | awk -v prg="$prg" '$0 ~ prg { print $1, $4 }'))
read -p "kILL ${check[1]} ${check[0]}? [y/n]"

(顺便说一句,将问号与前一个单词对齐,就像英语拼写中的惯例一样,也会解决你的问题,尽管有点意外。还请注意如何避免上述示例中的grep。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43031839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档