awk 和 bash 脚本?

awk and bash script?

我想知道为什么它不起作用。 请多多指教。

1.工作

$ nu=`awk '/^Mem/ {printf(*0.7);}' <(free -m)`
$ echo $nu
1291.5

2。不工作

$ cat test.sh
#!/bin/bash
nu=`awk '/^Mem/ {printf(*0.7);}' <(free -m)`
echo $nu
$ sh test.sh  
test.sh: command substitution: line 2: syntax error near unexpected token `('
test.sh: command substitution: line 2: `awk '/^Mem/ {printf(*0.7);}' <(free -m)'

能否请您尝试以下。

nu=$(free -m | awk '/^Mem/ {print *0.7}')
echo "$nu"

注意的事情是:

  • 反引号的使用已被弃用,因此请使用 $ 来存储变量的值。
  • 另外,第一个 运行 free 命令通过使用 | 将其标准输出作为标准输入传递给 awk 命令(这应该是发送输出的理想方式命令 awk 在这种情况下特别)并将其输出保存到名为 nu.
  • 的变量中
  • 现在终于通过 echo 打印变量 nu
  • 由于 <(...) 进程替换由 bash 而不是 sh 支持,所以我试图提供一个解决方案,它可以在没有进程替换的情况下支持(我之前也提到过)。

之所以在脚本中加shebang是为了在文件具有执行权限的情况下定义一个解释器指令。

然后,你应该调用它,例如

$ ./test.sh

设置权限后

$ chmod +x test.sh

<( ) 构造 ("process substitution") 并非在所有 shell 中都可用,甚至在 bash 中以名称 "sh" 调用时也不可用。当您 运行 带有 sh test.sh 的脚本时,它会覆盖 shebang(指定 bash),因此该功能不可用。您需要使用 bash 显式 运行 脚本,或者(更好)只是 运行 作为 ./test.sh 并让 shebang 行完成它的工作。