Bash
如何在bash中使用awk和echo
如果我在 bash 腳本(類似於這個)中執行以將內容髮送到文件:
sudo ./bar.sh > foo
內容欄.sh:
echo 'for pid in $(ps -ef | grep "smbd" | awk '{print $2}'); do kill -9 $pid &> /dev/null; done'
富出:
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
我如何得到它?
首先,除非
sudo
確實需要使用sudo
. 我真的不能足夠強調這一點。除非您收到“權限被拒絕”錯誤,否則您不需要也不sudo
應該使用sudo
. 所以你不需要sudo ./bar.sh
,只需執行./bar.sh
。接下來,您不需要
echo
獲取命令的結果。這不是必需的:echo '$(ps -ef | grep "smbd" | awk '{print $2}')'
您只需要執行命令本身。您不需要命令替換 (
$(command)
) 或回顯。只要在你的腳本中有這個:ps -ef | grep "smbd" | awk '{print $2}'
請注意,如果您想獲取正在執行的程序的 PID,您也不需要
ps
。您可以只使用pgrep smbd
which 避免grep
過程本身出現在結果中的問題。最後,如果要列印多行字元串作為輸出,可以使用here doc代替許多 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