Назад | Перейти на главную страницу

Конкатенатная переменная в строковом bash

Я хочу убить процесс в указанном порту (переменной)

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

но переменная PORT не попадает в команду.

используйте lsof для этой задачи:

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

Попробуйте использовать двойные кавычки, чтобы обернуть awk вместо одинарных кавычек. Bash не заменяет переменные внутри одинарных кавычек.

Вам нужно будет либо заменить двойные кавычки внутри команды на одинарные, либо экранировать их обратной косой чертой.

Добавляя к предыдущим ответам, просто чтобы показать способ исправить ваш метод:

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)}'

Одиночные кавычки просят оболочку передать заключенную строку без каких-либо изменений. Так ${PORT} не переводится в 3030. Это всего лишь набор символов, как и любая другая строка.

Просто используйте это: '$4~/:*'${PORT}'$/{gsub(/\/.*/,"",$NF);cmd="kill -9 "$NF;system(cmd)}'
Вы закрываете одинарную кавычку непосредственно перед ${port} и снова откройте его сразу после (без пробелов). Это позволит оболочке перевести вашу переменную.