【问题标题】:Why would someone use echo to assign values to variables in bash or ksh?为什么有人会使用 echo 为 bash 或 ksh 中的变量赋值?
【发布时间】:2016-06-08 16:11:30
【问题描述】:

最近我遇到了一种不寻常的使用 echo 在客户端的 ksh 脚本中分配变量的情况。

比如有很多例子如下

a='something'
b='else'
c=`echo "${a} ${b}"`

我无法想出任何可能有人这样做的原因。

这可能有一些遗留原因吗? (我做 shell 已经 30 多年了,我从来没有见过这个)

还是只是无知?

【问题讨论】:

  • 他们对 shell 脚本的工作原理一无所知?大概吧。
  • 可能是遗留问题?他们之前做了一些对使用反引号有意义的事情,然后在发生变化时做出最小的变化?
  • 有趣。我可以为 printf 想出很多理由,但在我的脑海中没有一个 echo 的理由。
  • Shell 脚本有幸被许多从未想要或没有机会(或无法)学习它的人使用。即使在大公司的大型生产脚本中,您也会看到各种初学者/无知的反模式。

标签: linux bash shell ksh


【解决方案1】:

在当前的 bash 或其 POSIX sh 或 Bourne 的前身中,没有任何令人信服的理由。

c="$a $b"

...是给定代码的完全替代品,并且运行速度要快得多(尝试将其放入循环中;由反引号创建的命令替换,将新的 shell 作为子进程分叉并读取其标准输出——a高开销操作)。

【讨论】:

  • 感谢 cmets。我正在清理这些脚本。多余的回声被删除,反引号被转换为 $()​​。还去除了“无用的猫”,这也很丰富。
【解决方案2】:

你看到的是一个错误使用 echo 的例子,因为 c 可以声明为:

c="$a $b"

echo 的一个常见用途是当您需要命令来过滤输出时,例如

$ line="100090 $100,00 Mary"
$ name=`echo "$line" | grep -Eo "[a-zA-Z]+$"`
echo $name
Mary

但是如果你根本不使用 echo 会更有效。上面的同样的事情可以用“read”来完成,而不需要创建一个新的进程:

$ line="100090 $100,00 Paul"
$ read -r _ _ name _ <<<"$line"
echo $name
Paul

【讨论】:

  • 这实际上根本不是一个好例子:它对$line的内容进行字符串拆分和全局扩展。因此,如果您有一列包含*,它将被替换为文件名列表;如果您的列之间有制表符,它们将成为空格;等
  • 此外,与启动外部工具来提取它相比,简单地要求 bash 为您提供行中的第三行要高效得多。如果您使用单个 awk 进程来处理整个字符串,awk 是有意义的——而不是一次一行的操作。
  • $name 是字符串的第三个字段,不是第三行
  • 我说的是“你的第三行”,我没有说“第三行”。不过,“列”或“字段”确实会更准确。
  • 无论如何,这应该说明为什么你会在变量赋值中使用 echo。
猜你喜欢
  • 1970-01-01
  • 2017-06-04
  • 2015-07-22
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 2023-03-09
  • 2016-06-01
  • 2020-02-01
相关资源
最近更新 更多