Bash

如何在bash中使用awk和echo

  • December 30, 2021

如果我在 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 smbdwhich 避免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

引用自:https://unix.stackexchange.com/questions/684429