在字符串 bash 中连接变量

在字符串 bash 中连接变量

我想终止指定端口(变量)中的进程

export PORT=3030
netstat -ntlp | awk '$4~/:*${PORT}$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'

但变量 PORT 没有出现在命令中。

答案1

使用 lsof 执行此任务:

PORT=3030
kill $(lsof -t -ni:$PORT)

答案2

尝试使用双引号awk而不是单引号来包裹命令。Bash 不会替换单引号内的变量。

您需要将命令中的双引号更改为单引号或使用反斜杠将其转义。

答案3

添加以前的答案,只是为了展示一种修复方法的方法:

netstat -ntlp | awk '$4 ~ PORT {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}' PORT='3030'

或者

export PORT=3030
netstat -ntlp | awk '$4~ ENVIRON["PORT"] {gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'

答案4

单引号要求 shell 传递括起来的字符串而不做任何更改。所以${PORT}不会转换为 3030。它只是一串字符,与任何其他字符串一样。

只需使用这个:'$4~/:*'${PORT}'$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
关闭前面的单引号${port},然后重新打开它(没有任何空格)。这将允许 shell 翻译您的变量。

相关内容