在shell脚本中执行awk命令时出错

时间:2016-06-04 06:19:20

标签: shell awk

我正在尝试打印内存细节。使用shell脚本的Total,free和used内存。这是我的代码 -

printf "\nSystem Details\n"
printf "CPU $(cat /proc/cpuinfo | grep "model name" | head -1)" 

printf "Total Memory:"
printf "$(awk '/^Mem/ {print $3}' <(free -m))"

但是终端没有显示任何内存细节。它显示了这个错误。

Memory:info.sh: command substitution: line 23: syntax error near unexpected token `('
info.sh: command substitution: line 23: `awk '/^Mem/ {print $3}' <(free -m))"'

1 个答案:

答案 0 :(得分:2)

让我们在bash下运行相关行:

$ printf "$(awk '/^Mem/ {print $3}' <(free -m))"
5603$ 

有效。现在,让我们在dash下尝试:

$ printf "$(awk '/^Mem/ {print $3}' <(free -m))"
dash: 1: Syntax error: "(" unexpected

现在,我们看到有关意外(的语法错误。该错误是因为dash不支持process substitution

如果你想在dash或类似的shell下运行,解决方案就是改用管道:

$ printf "$(free -m | awk '/^Mem/{print $3}')"
5623$
bash,zsh,Ksh88,ksh93支持

进程替换,但不支持pdksh,mksh或dash。所有POSIX shell都应该支持管道方法。

改进

只要输出不包含printf-active字符,上述操作就可以正常工作。最好使用显式格式字符串,从而避免令人不快的意外:

printf "%s" "$(free -m | awk '/^Mem/{print $3}')"