如何在 bash 中使用 awk 和 echo

如何在 bash 中使用 awk 和 echo

如果我在 bash 脚本中运行(类似于这个) 将内容发送到文件:

sudo ./bar.sh > foo

内容bar.sh:

echo 'for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done'

foo 输出:

for pid in $(ps -ef | grep "smbd" | awk {print }); do kill -9 $pid &> /dev/null; done

$2是迷失在外面。

预期输出:

for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done

我怎样才能得到它?

答案1

首先,永远不要运行东西,sudo除非确实有必要运行它们sudo。我真的无法充分强调这一点。除非您收到“权限被拒绝”错误,否则您不需要sudo也不应该使用sudo.所以你不需要sudo ./bar.sh,只要跑就可以了./bar.sh

接下来,您不需要echo获取命令的结果。这是不需要的:

echo '$(ps -ef | grep "smbd" | awk '{print $2}')'

您所需要的只是运行命令本身。您不需要命令替换 ( $(command)) 或 echo。只需在您的脚本中添加以下内容即可:

ps -ef | grep "smbd" | awk '{print $2}'

请注意,如果您想获取正在运行的进程的 PID,那么您实际上也不需要ps。您可以只使用它,以避免过程本身出现在结果中pgrep smbd的问题。grep

最后,如果你想打印多行字符串作为输出,你可以使用这里是文档而不是许多 echo 语句。因此,将所有这些放在一起,您应该像bar.sh这样:

#!/bin/sh

cat <<'EoF'
for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do 
    kill -9 "$pid" &> /dev/null
done
EoF

然后运行它./bar.sh > foo(不sudo!)。

或者,这是相同方法的更简单版本:

#!/bin/sh

cat <<'EoF'
ps -ef | awk '/smbd/{print $2}' | while read pid; do 
    kill -9 "$pid" &> /dev/null
done
EoF

或者,更简单:

#!/bin/sh

printf '%s\n' 'kill -9 $(pgrep smbd)'

这就引出了最后一点:你是吗?当然你真的想要一个脚本吗?要终止所有正在运行的smbd进程,您只需要一个命令:

pkill -9 smbd

相关内容