【发布时间】:2021-05-02 19:01:40
【问题描述】:
我确实觉得自己很愚蠢,但是谁能给我解释一下,为什么会这样:
current="`smartctl -a /dev/sda | awk '/Serial Number/ {printf "%s%s%s %s ", "\033[31m","/dev/sda","\033[0m",$3}'`" current2="`$current | awk '{print $2}'`"
导致“/dev/sda:没有这样的文件或目录”,而这:
current2="`smartctl -a /dev/sda | awk '/Serial Number/ {printf "%s%s%s %s ", "\033[31m","/dev/sda","\033[0m",$3}' | awk '{print $2}'`"
正在工作,这个:
current="`smartctl -a /dev/sda | awk '/Serial Number/ {printf "%s%s%s %s ", "\033[31m","/dev/sda","\033[0m",$3}'`" current2="`echo $current | awk '{print $2}'`"
还在工作
【问题讨论】:
-
一本好书可以解决你的问题stackoverflow.com/questions/19075671/…
-
问题是管道中的东西(
thing1 | thing2)必须是命令(比如echo $current和awk '{print $2}'),而不仅仅是数据片段(比如只是$current)。当您使用$current | ...时,shell 会尝试将$current的内容视为命令,但它会失败。此外,您应该双引号引用变量以避免奇怪的解析问题(例如echo "$current"而不仅仅是echo $current)。 shellcheck.net 会发现其中的一些问题,也会有其他有用的建议。 -
mywiki.wooledge.org/Quotes 和 mywiki.wooledge.org/BashFAQ/082 描述了您目前缺少的两个 shell 编程基础。